Source code for titan_pylib.graph.grid_bfs
1from collections import deque
2
3
[docs]
4def grid_bfs(field, sx, sy, tx, ty, ng="#"):
5 dx = [0, 1, 0, -1]
6 dy = [1, 0, -1, 0]
7 # ↓ → ↑ ←
8 n = len(field)
9 m = len(field[0])
10 dist = [[-1] * m for _ in range(n)]
11 dist[sy][sx] = 0
12 todo = deque([(sy, sx)])
13 while todo:
14 vy, vx = todo.popleft()
15 for d in range(len(dx)):
16 ny, nx = vy + dy[d], vx + dx[d]
17 if 0 <= ny < n and 0 <= nx < m:
18 if field[ny][nx] == ng or dist[ny][nx] != -1:
19 continue
20 dist[ny][nx] = dist[vy][vx] + 1
21 if ny == ty and nx == tx:
22 break
23 todo.append((ny, nx))
24 else:
25 continue
26 break
27 # return dist
28
29 direct = ("U", "L", "D", "R")
30 fukugen = []
31 di = dist[ty][tx]
32 gy, gx = ty, tx
33 while di:
34 for d in range(len(dx)):
35 ny, nx = gy + dy[d], gx + dx[d]
36 if 0 <= ny < n and 0 <= nx < m:
37 if dist[ny][nx] == di - 1:
38 di -= 1
39 fukugen.append(direct[d])
40 if ny == sy and nx == sx:
41 break
42 gy, gx = ny, nx
43 break
44 return fukugen[::-1]