Description
We start at the source
square (denoted as S
below) and want to reach the target
square (denoted as T
). Each move, we can walk to a 4-directionally adjacent square in the grid that isn’t in the given list of blocked
squares (denoted as #
).
############
#....#....S#
#.....#....#
#......#...#
#.......#..#
#........#.#
#T........##
############
The grid size is 1 million by 1 million and the maximum number of blocked squares is 200. (You cannot go past the edge of the grid or where the coordinates are negative numbers.)
Return True
if and only if there is a path otherwise return False
# Input
blocked = [[0,1],[1,0]]
source = [0,0]
target = [0,2]
# Output is False
Solution
def get_children(point):
children = []
y, x = point
size_y, size_x = (1000000, 1000000)
if y-1 >= 0:
children.append((y-1, x))
if x-1 >= 0:
children.append((y,x-1))
if y+1 <= size_y:
children.append((y+1,x))
if x+1 <= size_x:
children.append((y,x+1))
return children
def bfs(source, target, is_blocked):
queue = []
marked = set()
queue.append((source,1))
marked.add(source)
while queue:
node_id, depth = queue.pop(0)
# We only check a depth of 200 in breadth first search since
# that's the max number of blocked squares
if depth > 200:
return True
for child_id in get_children(node_id):
if child_id in is_blocked:
continue
if child_id == target:
return True
if child_id not in marked:
queue.append((child_id,depth+1))
marked.add(child_id)
return False
class Solution:
def isEscapePossible(self, blocked: List[List[int]], source: List[int], target: List[int]) -> bool:
is_blocked = set()
for item in blocked:
is_blocked.add(tuple(item))
target = tuple(target) # We check a depth of 200 from the start
source = tuple(source) # And we check from the finish to cover all
if bfs(source, target, is_blocked) and bfs(target,source,is_blocked):
return True
return False