
전형적인 BFS문제로 인접한 노드들부터 탐색해서 최단 경로(문제에선 최소의 일수)를 구하는 문제이다.
BFS문제이므로 queue를 이용할 생각을 해야한다.
파이썬으로 풀었으므로 deque를 이용함.
popleft()한 익은 토마토에 대해서 상하좌우 검사를 하고 적절하면 움직인 위치에 이전위치를 1더한다.python
from collections import deque
M, N = map(int, input().split())
# M은 가로 N은 세로
graph = []
for _ in range(N):
graph.append(list(map(int, input().split())))
tomatoes = deque([])
for i in range(N):
for j in range(M):
if graph[i][j] == 1:
tomatoes.append([i, j])
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs():
days = 0
while tomatoes:
v = tomatoes.popleft()
curX = v[0]
curY = v[1]
for i in range(4):
nx = curX + dx[i]
ny = curY + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= M:
continue
if graph[nx][ny] == -1:
continue
if graph[nx][ny] == 0:
graph[nx][ny] = graph[curX][curY] + 1
days = graph[nx][ny]
tomatoes.append([nx, ny])
# print('--------------')
# for i in range(N):
# for j in range(M):
# print(graph[i][j], end=' ')
# print('')
# print('------------')
return days - 1
start = False
for i in range(N):
for j in range(M):
if graph[i][j] == 0:
start = True
break
if start == False:
print(0)
else:
result = bfs()
flag = False
for i in range(N):
for j in range(M):
if graph[i][j] == 0:
flag = True # 다익을순 없다.
break
if flag == True:
print(-1)
else:
print(result)