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