假设我们有一个网格,有一百万行和一百万列,我们还有一个被阻止的单元格列表。现在我们将从源正方形开始,并想要到达目标正方形。在每一步中,我们可以走到网格中上,下,左,右相邻的正方形,该正方形不在给定的阻止单元列表中。
我们必须检查是否可以通过一系列移动达到目标正方形。
因此,如果输入就像阻塞= [[0,1],[1,0]],源= [0,0],目标= [0,3],那么输出将为False
为了解决这个问题,我们将遵循以下步骤-
阻止的:=设置所有阻止的单元格的集合
定义一个方法dfs()
,将采用x,y,目标和可见
如果(x,y)不在网格范围内或(x,y)处于阻塞状态或(x,y)处于可见状态,则
返回假
将(x,y)添加到可见
如果看到的大小> 20000或(x,y)是目标,则
返回真
返回dfs(x + 1,y,target,seen)或dfs(x-1,y,target,seen)或dfs(x,y + 1,target,seen)或dfs(x,y-1,target,seen)看过)
返回dfs(源[0],源[1],目标,空集)和dfs(目标[0],目标[1],源,空集)
让我们看下面的实现以更好地理解-
class Solution(object): def isEscapePossible(self, blocked, source, target): blocked = set(map(tuple, blocked)) def dfs(x, y, target, seen): if not (0 <= x < 10**6 and 0 <= y < 10**6) or (x, y) in blocked or (x, y) in seen: return False seen.add((x, y)) if len(seen) > 20000 or [x, y] == target: return True return dfs(x + 1, y, target, seen) or \ dfs(x - 1, y, target, seen) or \ dfs(x, y + 1, target, seen) or \ dfs(x, y - 1, target, seen) return dfs(source[0], source[1], target, set()) and dfs(target[0], target[1], source, set()) ob = Solution()print(ob.isEscapePossible([[0,1],[1,0]], [0,0], [0,3]))
[[0,1],[1,0]], [0,0], [0,3]
输出结果
False