from collections import deque
n, m = map(int,input().split())
maze = [list(map(int,list(input()))) for _ in range(n)]
visited = [[[0]*m for _ in range(n)] for _ in range(2)]
dx = [-1,1,0,0]
dy = [0,0,-1,1]
def bfs():
visited[0][0][0] = 1
queue = deque([(0,0,0)])
while queue:
w,x,y = queue.popleft()
if x == n-1 and y == m-1:
return visited[w][x][y]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if maze[nx][ny] == 0 and visited[w][nx][ny] == 0:
queue.append((w,nx,ny))
visited[w][nx][ny] = visited[w][x][y] + 1
elif maze[nx][ny] == 1 and w == 0:
queue.append((w+1,nx,ny))
visited[w+1][nx][ny] = visited[w][x][y] + 1
return -1
print(bfs())
이번 문제는 (0,0) 위치에서 (N,M) 로 이동하기 위한 최소 이동 칸 수를 구하되, 더 빨리 도달할 수 있다면 벽을 1개까지 부술 수 있다는 조건이 있는 문제이다.
바로 이전에 풀었던 미로 탈출 문제(https://woohyun-king.tistory.com/196)와 거의 동일한 문제로, (0,0)에서 시작하여 (N,M)를 도착 지점으로 한다는 점과 시작하는 칸도 카운팅을 한다는 점만 차이가 있다.
최단 거리를 구하기 위한 BFS 알고리즘과 벽을 부순 상황에 따라 두 가지 2차원 배열로 구별하여 이동경로를 기록한다는 점을 이용하여 풀이할 수 있는 문제였다 :)
'Algorithm 💡 > BFS' 카테고리의 다른 글
[백준 1525번] 퍼즐 (0) | 2023.08.12 |
---|---|
[백준 16234번] 인구 이동 (0) | 2023.08.07 |
[백준 14923번] 미로 탈출 (0) | 2023.08.04 |
[프로그래머스 Lv.2] 게임 맵 최단거리 (0) | 2023.08.02 |
[프로그래머스 Lv.2] 타겟 넘버 (0) | 2023.08.02 |