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除外)。

  • 我们可以在房间之间自由地来回走动。

  • 当且仅当我们可以进入每个房间时,我们才应返回true。

因此,我们将从房间0开始,拿起钥匙1,然后转到房间1,选择钥匙2,形成房间2,选择钥匙3,然后访问3,如果访问了所有房间,则返回true。

为了解决这个问题,我们将遵循以下步骤-

  • 设置一个空队列,并为所有房间创建一个访问数组,并将其设置为false

  • 队列:= addRooms(房间,0,队列,已访问)

  • 造访过[0]:= Ture

  • 而队列中有一些元素

    • 队列:= addRooms(房间,队列[0],队列,已访问)

    • 将visit [queue [0]]标记为true,

    • 从队列中删除元素

  • 当访问数组中的所有元素都为true时,返回true

  • addRoom()将采取的房间,指数,队列和数组访问,这将是像

  • 为我在房间[索引]数组中

    • 如果未访问我,则将我插入队列

  • 返回队列

示例(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