假设我们有N个房间,我们从房间0开始。在每个房间中,0、1、2,...,N-1中都有一个不同的数字,每个房间可能都有一些用于访问下一个房间的键。因此,换句话说,每个房间i都有一个钥匙房间[i]的列表,每个钥匙房间[i] [j]是[0,1,...,N-1]中的整数,其中N =房数。房间。关键房间[i] [j] = v,这将打开数字为v的房间。因此,如果输入为[[1],[2],[3],[]]。那么输出将为真。还有几点需要牢记-
最初,所有房间都开始锁定(房间0除外)。
我们可以在房间之间自由地来回走动。
当且仅当我们可以进入每个房间时,我们才应返回true。
因此,我们将从房间0开始,拿起钥匙1,然后转到房间1,选择钥匙2,形成房间2,选择钥匙3,然后访问3,如果访问了所有房间,则返回true。
为了解决这个问题,我们将遵循以下步骤-
设置一个空队列,并为所有房间创建一个访问数组,并将其设置为false
队列:= addRooms(房间,0,队列,已访问)
造访过[0]:= Ture
而队列中有一些元素
队列:= addRooms(房间,队列[0],队列,已访问)
将visit [queue [0]]标记为true,
从队列中删除元素
当访问数组中的所有元素都为true时,返回true
在addRoom()
将采取的房间,指数,队列和数组访问,这将是像
为我在房间[索引]数组中
如果未访问我,则将我插入队列
返回队列
让我们看下面的实现以更好地理解-
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