알고스팟 운영진이 (N, M)으로 이동하기 위해 벽을 최소 몇 개 부수어야 하는지 구하기.
입력 | 출력 |
---|---|
3 3 011 111 110 | 3 |
4 2 0001 1000 | 0 |
6 6 001111 010000 001111 110001 011010 100010 | 2 |
: 상하좌우 탐색 시 0이면 우선순위에 앞서기 위해 appendleft. 1이면 append.
이 때 1이면 벽을 부수는 것이므로 1을 더해서 visited에 기록
우선순위 큐(힙) 자료구조를 이용할 수 있다.
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())