from collections import deque
graph = [[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]
# To move left, right, up and down
delta_x = [-1, 1, 0, 0]
delta_y = [0, 0, 1, -1]
def valid(x, y):
if x < 0 or x >= len(graph) or y < 0 or y >= len(graph[x]):
return False
return (graph[x][y] != 1)
def solve(start, end):
Q = deque([start])
dist = {start: 0}
while len(Q):
curPoint = Q.popleft()
curDist = dist[curPoint]
if curPoint == end:
return curDist
for dx, dy in zip(delta_x, delta_y):
nextPoint = (curPoint[0] + dx, curPoint[1] + dy)
if not valid(nextPoint[0], nextPoint[1]) or nextPoint in dist.keys():
continue
dist[nextPoint] = curDist + 1
Q.append(nextPoint)
print(solve((0,0), (6,7)))
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKCgpncmFwaCA9IFtbMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMF0sCgkJIFswLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwXSwKCQkgWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLAoJCSBbMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMF0sCgkJIFswLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwXSwKCQkgWzAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDBdLAoJCSBbMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMF0sCgkJIFswLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwXSwKCQkgWzAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDBdLAoJCSBbMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMF1dCgojIFRvIG1vdmUgbGVmdCwgcmlnaHQsIHVwIGFuZCBkb3duCmRlbHRhX3ggPSBbLTEsIDEsIDAsIDBdCmRlbHRhX3kgPSBbMCwgMCwgMSwgLTFdCgpkZWYgdmFsaWQoeCwgeSk6CglpZiB4IDwgMCBvciB4ID49IGxlbihncmFwaCkgb3IgeSA8IDAgb3IgeSA+PSBsZW4oZ3JhcGhbeF0pOgoJCXJldHVybiBGYWxzZQoJcmV0dXJuIChncmFwaFt4XVt5XSAhPSAxKQoKZGVmIHNvbHZlKHN0YXJ0LCBlbmQpOgoJUSA9IGRlcXVlKFtzdGFydF0pCglkaXN0ID0ge3N0YXJ0OiAwfQoJd2hpbGUgbGVuKFEpOgoJCWN1clBvaW50ID0gUS5wb3BsZWZ0KCkKCQljdXJEaXN0ID0gZGlzdFtjdXJQb2ludF0KCQlpZiBjdXJQb2ludCA9PSBlbmQ6CgkJCXJldHVybiBjdXJEaXN0CgkJZm9yIGR4LCBkeSBpbiB6aXAoZGVsdGFfeCwgZGVsdGFfeSk6CgkJCW5leHRQb2ludCA9IChjdXJQb2ludFswXSArIGR4LCBjdXJQb2ludFsxXSArIGR5KQoJCQlpZiBub3QgdmFsaWQobmV4dFBvaW50WzBdLCBuZXh0UG9pbnRbMV0pIG9yIG5leHRQb2ludCBpbiBkaXN0LmtleXMoKToKCQkJCWNvbnRpbnVlCgkJCWRpc3RbbmV4dFBvaW50XSA9IGN1ckRpc3QgKyAxCgkJCVEuYXBwZW5kKG5leHRQb2ludCkKCnByaW50KHNvbHZlKCgwLDApLCAoNiw3KSkpCg==