알고리즘

백준 7576번 : 토마토(python)

jenyy 2021. 7. 26. 18:25

https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

from collections import deque
m,n = map(int,input().split())
box = [list(map(int,input().split())) for _ in range(n)]
ripe = deque()
for i in range(n):
    for j in range(m):
        if box[i][j] == 1:
            ripe.append((i,j))
dx = [0,1,0,-1]
dy = [1,0,-1,0]

def bfs(m,n,box):
    days = -1

    while ripe:
        days += 1
        for _ in range(len(ripe)):
            x,y = ripe.popleft()
            for i in range(4):
                nx,ny = x+dx[i],y+dy[i]
                if 0<=nx<n and 0<=ny<m and box[nx][ny]==0:
                    box[nx][ny] = box[x][y] + 1
                    ripe.append((nx,ny))
    for row in box:
        if 0 in row:
            return -1
    return days

print(bfs(m,n,box))