841. 钥匙和房间

  1. N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:012,...,N-1
  2. 并且房间里可能有一些钥匙能使你进入下一个房间。
  3. 在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j]
  4. [0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length 钥匙 rooms[i][j] = v 可以
  5. 打开编号为 v 的房间。
  6. 最初,除 0 号房间外的其余所有房间都被锁住。
  7. 你可以自由地在房间之间来回走动。
  8. 如果能进入每个房间返回 true,否则返回 false
  9. 示例 1
  10. 输入: [[1],[2],[3],[]]
  11. 输出: true
  12. 解释:
  13. 我们从 0 号房间开始,拿到钥匙 1
  14. 之后我们去 1 号房间,拿到钥匙 2
  15. 然后我们去 2 号房间,拿到钥匙 3
  16. 最后我们去了 3 号房间。
  17. 由于我们能够进入每个房间,我们返回 true
  18. 示例 2
  19. 输入:[[1,3],[3,0,1],[2],[0]]
  20. 输出:false
  21. 解释:我们不能进入 2 号房间。
  22. 来源:力扣(LeetCode
  23. 链接:https://leetcode-cn.com/problems/keys-and-rooms
  24. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

时间:1min
答案

  1. class Solution:
  2. def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
  3. n=len(rooms)
  4. de=rooms[0]
  5. visit=set(de)
  6. while de:
  7. new_q=[]
  8. for node in de:
  9. for room in rooms[node]:
  10. if room not in visit:
  11. new_q.append(room)
  12. visit.add(room)
  13. de=new_q
  14. return len(visit)==n if 0 in visit else len(visit)==n-1

要点
搜索就完事了。