# 미로만들기
from collections import deque
import sys
input = sys.stdin.readline
N = int(input())
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
arr = []
for i in range(N):
arr.append(list(map(int, input().strip())))
def bfs():
q = deque()
q.append((0, 0))
visited = [[-1] * N for _ in range(N)]
visited[0][0] = 0
while q:
x, y = q.popleft()
if x == N-1 and y == N-1:
return visited[x][y]
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if 0 <= nx < N and 0 <= ny < N and visited[nx][ny] == -1:
if arr[nx][ny] == 1:
q.appendleft((nx, ny))
visited[nx][ny] = visited[x][y]
else:
q.append((nx, ny))
visited[nx][ny] = visited[x][y] + 1
print(bfs())
BFS
1. 시작지점(0, 0)에서 bfs를 한다. (visited = 검은 방을 흰 방으로 바꾼 횟수)
- 해당 위치가 흰 방(1)이면 이전 visited의 값으로 초기화, appendleft(흰 방 먼저 탐색)
- 해당 위치가 검은 방(0)이면 이전 visited에서 1을 더해서 초기화, append
2. x, y 가 도착지점(N-1, N-1)이면 return visited[x][y]
흰 방을 먼저 탐색하기 때문에
처음 도착지점에 도착한 visited의 값은 최솟값이 된다.
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 17822번 - 원판 돌리기 (파이썬) (0) | 2022.03.08 |
---|---|
[백준] 2239번 - 스도쿠 (파이썬) (0) | 2022.03.05 |
[백준] 4179번 - 불! (파이썬) (0) | 2022.03.03 |
[백준] 2075번 - N번째 큰 수 ( 파이썬) (0) | 2022.03.02 |
[백준] 10775번 - 공항 (파이썬) (0) | 2022.03.01 |