이번 문제는 BFS를 이용하여 갈 수 있는 공간 중 조건에 부합하는 위치로 이동하는 과정을 더이상 움직일 수 없을 때까지 반복하는 방식으로 접근하였다. 답을 찾아보지 않고 풀이하여 시간이 오래 걸렸지만 그만큼 얻은게 많은 문제이다.
import sys
from collections import deque
n=int(input())
grid=[list(map(int, input().split())) for _ in range(n)]
cur_y, cur_x=0, 0
for i in range(n):
for j in range(n):
if grid[i][j]==9:
cur_y, cur_x=i, j
grid[i][j]=0
break
baby=2
dy, dx=[-1, 0, 0, 1], [0, -1, 1, 0]
def bfs(cur_y, cur_x):
q=deque()
q.append((0, cur_y, cur_x, 0))
visited=[[False]*n for _ in range(n)]
visited[cur_y][cur_x]=True
results=[]
while q:
d, y, x, flg=q.popleft()
md=sys.maxsize
if flg==1 and md>=d:
md=d
results.append((d, y, x))
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<n and 0<=nx<n and not visited[ny][nx]:
if 0<grid[ny][nx]<baby:
visited[ny][nx]=True
q.append((d+1, ny, nx, 1))
elif grid[ny][nx]==baby or grid[ny][nx]==0:
visited[ny][nx]=True
q.append((d+1, ny, nx, 0))
if not results:
return [-1, -1, -1]
results.sort(key=lambda x: (x[0], x[1], x[2]))
return results[0]
answer=0
cnt=0
while True:
time, cur_y, cur_x=bfs(cur_y, cur_x)
if [time, cur_y, cur_x]==[-1, -1, -1]:
print(answer)
break
answer+=time
grid[cur_y][cur_x]=0
cnt+=1
if cnt==baby:
baby+=1
cnt=0