https://www.acmicpc.net/problem/2206
N×M의 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다.
(1, 1)에서 (N, M)의 위치까지 최단 경로로 이동하려 한다. (시작하는 칸과 끝나는 칸도 포함해서 센다.)
-> 최단 경로 문제 BFS로 풀어야 함
만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다.
-> 이 문제가 가진 포인트
(입력 및 선언)
(bfs 함수)
(맵 시작)
from collections import deque
n, m = map(int, input().split())
dy = [-1, 0 , 1, 0]
dx = [0, 1, 0, -1]
adjMatrix = []
visited = [[[0] * 2 for _ in range(m)] for _ in range(n)]
queue = deque([])
for _ in range(n):
adjMatrix.append(list(map(int, input())))
def bfs():
while queue:
curY, curX, curZ = queue.popleft()
if curY == n-1 and curX == m-1:
return visited[curY][curX][curZ]
for i in range(4):
ny = curY + dy[i]
nx = curX + dx[i]
if ny < 0 or nx < 0 or ny >= n or nx >= m:
continue
if adjMatrix[ny][nx] == 1 and curZ == 0:
visited[ny][nx][1] = visited[curY][curX][0] + 1
queue.append((ny, nx, 1))
if adjMatrix[ny][nx] == 0 and visited[ny][nx][curZ] == 0:
visited[ny][nx][curZ] = visited[curY][curX][curZ] + 1
queue.append((ny, nx, curZ))
return -1
visited[0][0][0] = 1
queue.append((0, 0, 0))
print(bfs())
벽을 한 번만 부술 수 있기 때문에 언제 부수고 어떻게 기억하고 있어야 하는지 생각하는 것이 어려웠다.