สมมติว่าเรามี N ห้อง และเริ่มที่ห้อง 0 ในแต่ละห้องมีหมายเลขที่แตกต่างกันใน 0, 1, 2, ..., N-1 และแต่ละห้องอาจมีกุญแจบางอันเพื่อเข้าถึงห้องถัดไป กล่าวอีกนัยหนึ่ง แต่ละห้อง i มีรายการกุญแจ rooms[i] และแต่ละกุญแจ rooms[i][j] เป็นจำนวนเต็มใน [0, 1, ..., N-1] โดยที่ N = จำนวนห้อง กุญแจ rooms[i][j] = v จะเปิดห้องหมายเลข v ดังนั้นถ้าอินพุตคือ [[1], [2], [3], []] ผลลัพธ์จะเป็น true มีจุดสำคัญดังนี้ −
- เริ่มต้น ห้องทั้งหมดถูกล็อก (ยกเว้นห้อง 0)
- เราสามารถเดินไป-กลับระหว่างห้องได้อย่างอิสระ
- ควรคืนค่า true ก็ต่อเมื่อเราสามารถเข้าทุกห้องได้
เราจะเริ่มจากห้อง 0 หยิบกุญแจ 1 ไปห้อง 1 หยิบกุญแจ 2 ไปห้อง 2 หยิบกุญแจ 3 หลังเยี่ยมห้อง 3 ถ้าห้องทั้งหมดถูกเยี่ยมแล้ว คืนค่า true
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนต่อไปนี้ −
- สร้างคิวว่าง และสร้างอาร์เรย์ visited สำหรับทุกห้อง ตั้งค่าเป็น false
- queue := addRooms(rooms, 0, queue, visited)
- visited[0] := True
- while queue มีองค์ประกอบ
- queue := addRooms(rooms, queue[0], queue, visited)
- ตั้ง visited[queue[0]] เป็น true
- ลบองค์ประกอบออกจาก queue
- คืนค่า true เมื่อทุกองค์ประกอบใน visited array เป็น true
- ฟังก์ชัน addRoom() จะรับ rooms, index, queue และ visited array จะทำงานดังนี้
- for i ใน rooms[index] array
- ถ้า i ยังไม่ได้เยี่ยม ให้เพิ่ม i เข้า queue
- คืนค่า queue
- for i ใน rooms[index] array
ตัวอย่าง (Python)
มาดูการนำไปใช้เพื่อความเข้าใจที่ดีขึ้น −
class Solution(object):
def canVisitAllRooms(self, rooms):
queue = []
visited = [False for i in rooms]
queue = self.add_rooms(rooms, 0, queue, visited)
visited[0] = True
while len(queue) > 0:
queue = self.add_rooms(rooms, queue[0], queue, visited)
visited[queue[0]] = True
queue.pop(0)
return all(visited)
def add_rooms(self, rooms, index, queue, visited):
for i in rooms[index]:
if not visited[i]:
queue.append(i)
return queue
ob1 = Solution()
print(ob1.canVisitAllRooms([[1], [2], [3], []]))
อินพุต
[[1],[2],[3],[]]
ผลลัพธ์
true