アルゴ駅
白駿1261
Algospot運営チームが(N,M)に移動するために、少なくともどれだけの壁を破る必要があるかを求めた.
にゅうしゅつりょく
入出力330111111034 2000 1100006 600110000010000011110000011010101000102
方法
:上下左右にナビゲートする場合、0の場合はappendleftを優先します.1は追加を表します.
このとき1は壁を破り,1を加えてアクセスを記録する
知るところ
優先キュー(hip)データ構造を使用できます.
コード#コード#
インデックスを使用したプール
from collections import deque
import sys
def bfs(maps, visited, n, m):
visited[0][0] = 0
q = deque()
q.append((0,0))
dx = [-1,1,0,0]
dy = [0,0,-1,1]
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0<=nx<n and 0<=ny<m:
if visited[nx][ny] == -1 :
if maps[nx][ny] == 0:
visited[nx][ny] = visited[x][y]
q.appendleft((nx, ny))
else:
visited[nx][ny] = visited[x][y] + 1
q.append((nx, ny))
return visited[-1][-1]
m, n = map(int, sys.stdin.readline().split())
maps = [list(map(int, sys.stdin.readline().rstrip())) for _ in range(n)]
visited = [[-1]*m for _ in range(n)]
print(bfs(maps, visited, n, m))
お尻を利用した草
import heapq
import sys
def bfs():
q = []
heapq.heappush(q, [0, 0, 0])
visited[0][0] = 1
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
while q:
w, x, y = heapq.heappop(q)
if x==n-1 and y==m-1:
return w
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0<=nx<n and 0<=ny<m and visited[nx][ny] == 0:
heapq.heappush(q, (w+1 if maze[nx][ny] == 1 else w, nx, ny))
visited[nx][ny] = 1
m, n = map(int, sys.stdin.readline().split())
maze = [list(map(int, sys.stdin.readline().rstrip('\n'))) for _ in range(n)]
visited = [[0]*m for _ in range(n)]
print(bfs())
Reference
この問題について(アルゴ駅), 我々は、より多くの情報をここで見つけました https://velog.io/@sezeom/다익스트라-알고스팟テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol