Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

กุญแจและห้องใน Python


สมมติว่าเรามีห้อง 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],[]]))

อินพุต

ผลลัพธ์

จริง