[λ°±μ€ 7576 π₯] ν λ§ν
λ¬Έμ
μ² μμ ν λ§ν λμ₯μμλ ν λ§ν λ₯Ό 보κ΄νλ ν° μ°½κ³ λ₯Ό κ°μ§κ³ μλ€. ν λ§ν λ μλμ κ·Έλ¦Όκ³Ό κ°μ΄ 격μ λͺ¨μ μμμ μΉΈμ νλμ© λ£μ΄μ μ°½κ³ μ 보κ΄νλ€.

μ°½κ³ μ 보κ΄λλ ν λ§ν λ€ μ€μλ μ μ΅μ κ²λ μμ§λ§, μμ§ μ΅μ§ μμ ν λ§ν λ€λ μμ μ μλ€. λ³΄κ΄ ν νλ£¨κ° μ§λλ©΄, μ΅μ ν λ§ν λ€μ μΈμ ν κ³³μ μλ μ΅μ§ μμ ν λ§ν λ€μ μ΅μ ν λ§ν μ μν₯μ λ°μ μ΅κ² λλ€. νλμ ν λ§ν μ μΈμ ν κ³³μ μΌμͺ½, μ€λ₯Έμͺ½, μ, λ€ λ€ λ°©ν₯μ μλ ν λ§ν λ₯Ό μλ―Ένλ€. λκ°μ λ°©ν₯μ μλ ν λ§ν λ€μκ²λ μν₯μ μ£Όμ§ λͺ»νλ©°, ν λ§ν κ° νΌμ μ μ λ‘ μ΅λ κ²½μ°λ μλ€κ³ κ°μ νλ€. μ² μλ μ°½κ³ μ 보κ΄λ ν λ§ν λ€μ΄ λ©°μΉ μ΄ μ§λλ©΄ λ€ μ΅κ² λλμ§, κ·Έ μ΅μ μΌμλ₯Ό μκ³ μΆμ΄ νλ€.
ν λ§ν λ₯Ό μ°½κ³ μ 보κ΄νλ 격μλͺ¨μμ μμλ€μ ν¬κΈ°μ μ΅μ ν λ§ν λ€κ³Ό μ΅μ§ μμ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ‘μ λ, λ©°μΉ μ΄ μ§λλ©΄ ν λ§ν λ€μ΄ λͺ¨λ μ΅λμ§, κ·Έ μ΅μ μΌμλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ. λ¨, μμμ μΌλΆ μΉΈμλ ν λ§ν κ° λ€μ΄μμ§ μμ μλ μλ€.
μ λ ₯
첫 μ€μλ μμμ ν¬κΈ°λ₯Ό λνλ΄λ λ μ μ M,Nμ΄ μ£Όμ΄μ§λ€. Mμ μμμ κ°λ‘ μΉΈμ μ, Nμ μμμ μΈλ‘ μΉΈμ μλ₯Ό λνλΈλ€. λ¨, 2 ≤ M,N ≤ 1,000 μ΄λ€. λμ§Έ μ€λΆν°λ νλμ μμμ μ μ₯λ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ§λ€. μ¦, λμ§Έ μ€λΆν° Nκ°μ μ€μλ μμμ λ΄κΈ΄ ν λ§ν μ μ λ³΄κ° μ£Όμ΄μ§λ€. νλμ μ€μλ μμ κ°λ‘μ€μ λ€μ΄μλ ν λ§ν μ μνκ° Mκ°μ μ μλ‘ μ£Όμ΄μ§λ€. μ μ 1μ μ΅μ ν λ§ν , μ μ 0μ μ΅μ§ μμ ν λ§ν , μ μ -1μ ν λ§ν κ° λ€μ΄μμ§ μμ μΉΈμ λνλΈλ€.
ν λ§ν κ° νλ μ΄μ μλ κ²½μ°λ§ μ λ ₯μΌλ‘ μ£Όμ΄μ§λ€.
μΆλ ₯
μ¬λ¬λΆμ ν λ§ν κ° λͺ¨λ μ΅μ λκΉμ§μ μ΅μ λ μ§λ₯Ό μΆλ ₯ν΄μΌ νλ€. λ§μ½, μ μ₯λ λλΆν° λͺ¨λ ν λ§ν κ° μ΅μ΄μλ μνμ΄λ©΄ 0μ μΆλ ₯ν΄μΌ νκ³ , ν λ§ν κ° λͺ¨λ μ΅μ§λ λͺ»νλ μν©μ΄λ©΄ -1μ μΆλ ₯ν΄μΌ νλ€.
λ¬Έμ νμ΄
import sys
from collections import deque
m,n=map(int, sys.stdin.readline().split(' '))
tomato=[list(map(int, sys.stdin.readline().split(' '))) for _ in range(n)]
# νμ¬ μ΅μ ν λ§ν μ μμΉμ νμ¬ μκ°μ νμ μ μ₯
# λΉ μΉΈ μΈ κ²½μ° μ μ₯
ripen_tomato=deque()
not_exist=0
for i in range(n):
for j in range(m):
if tomato[i][j]==1:
ripen_tomato.append((i,j,0))
elif tomato[i][j]==-1:
not_exist+=1
# μ²μλΆν° λͺ¨λ ν λ§ν κ° μ΅μ΄μλ κ²½μ° 0 μΆλ ₯νκ³ μ’
λ£
num_of_ripen_tomato=len(ripen_tomato)
if num_of_ripen_tomato==(m*n-not_exist):
print(0)
sys.exit(0)
def spread_ripe():
global ripen_tomato, time
directions=[(1,0),(0,1),(-1,0),(0,-1)]
#visited=[[0]*m for _ in range(n)]
add_ripen_tomato=0
while ripen_tomato and ripen_tomato[0][2]==time:
y, x, t=ripen_tomato.popleft()
for di in directions:
dy=y+di[0]
dx=x+di[1]
if 0<=dy<n and 0<=dx<m and tomato[dy][dx]==0:
tomato[dy][dx]=1
ripen_tomato.append((dy,dx,t+1))
add_ripen_tomato+=1
if add_ripen_tomato:
return add_ripen_tomato
else:
return 0
time=0
while num_of_ripen_tomato<(n*m-not_exist):
# μ΅μ ν λ§ν μ μΈμ ν μ΅μ§ μμ ν λ§ν λ‘ μ ν
add_tomato=spread_ripe()
if add_tomato==0:
print(-1)
sys.exit(0)
num_of_ripen_tomato+=add_tomato
time+=1
print(time)
μ΄κΈ° μνμ μ΅μ ν λ§ν μ μμΉμ μκ°μ νμ μ μ₯νλ€. κ·Έλ¦¬κ³ , μ 체 μ΅μ΄μΌ νλ ν λ§ν μ κ°μλ₯Ό ꡬνκΈ° μν΄μ ν λ§ν κ° μ‘΄μ¬νμ§ μλ μΉΈμ κ°μλ not_exist λ³μμ μ μ₯ν΄λλ€.
λ¨Όμ μ μΌ μ²μμ ν λ§ν μ μνκ° μ μ₯λ tomatoλ₯Ό νμνλ©΄μ νμ μΆκ°ν΄μ€ μ΅μ ν λ§ν μ κ°μλ₯Ό num_of_ripen_tomato λ³μμ μ μ₯ν΄μ£Όκ³ , μ΅μ ν λ§ν μ κ°μκ° μ΅μ΄μΌ νλ ν λ§ν μ μ΄ κ°μ(n*m-not_exist)μ λμΌνμ§ μ²΄ν¬ν΄μ€¬λ€. λμΌνλ€λ©΄ 0μ μΆλ ₯νκ³ νλ‘κ·Έλ¨μ μ’ λ£νλ€.
μκ°λλ³λ‘ μ΅μ ν λ§ν μ κ°μλ₯Ό num_of_ripen_tomato λ³μμ μΆκ°νλ©΄μ, μ΅μ΄μΌ νλ ν λ§ν μ μ΄ κ°μλ³΄λ€ μμ λμ whileλ¬Έμ λ°λ³΅νλλ‘ νλ€.
μ°μ spread_ripen() ν¨μλ₯Ό ν΅ν΄μ ν λ§ν λ₯Ό μκ°λλ³λ‘ μ΅μ ν λ§ν μ κ°μλ₯Ό λ°νν΄μ add_tomato λ³μμ λ΄μ num_of_ripen_tomatoμ λνλλ‘ νλ€. κ·Έλ¦¬κ³ time λ³μλ₯Ό +1ν΄μ€λ€.
μ¬κΈ°μ, add_tomatoμ κ°μ΄ 0μ΄λ©΄, μ¦ spread_ripen() ν¨μκ° 0μ λ°ννλ©΄ λ μ΄μ μ΅ν μ μλ ν λ§ν κ° μλ€λ λ»μΈλ° num_of_ripen_tomatoκ° λͺ©νμΉμ λλ¬νμ§ λͺ»ν μνμ΄λ―λ‘ λͺ¨λ ν λ§ν λ₯Ό μ΅ν μλ μλ€λ κ²μΌλ‘ κ°μ£Όνκ³ -1μ μΆλ ₯νκ³ νλ‘κ·Έλ¨μ μ’ λ£νλ€.
spread_ripen() ν¨μμμλ μ΅μ ν λ§ν λ°μ΄ν°λ₯Ό μ μ₯νκ³ μλ ripen_tomato νλ₯Ό bfsλ₯Ό μ΄μ©ν΄μ νμνλ©΄μ μΈμ νκ³ μ΅μ§μμ ν λ§ν λ€μ μμΉμ νμ¬μκ°+1ν κ°μ ripen_tomato νμ λ£μ΄μ€λ€.
μ¬κΈ°μ whileλ¬Έμ μ‘°κ±΄μ΄ ripen_tomatoμ 첫λ²μ§Έ κ°μ 2λ²μ§Έ μΈλ±μ€κ° νμ¬ μκ°μ λνλ΄λ time λ³μμ λμΌν λμλ§ whileλ¬Έμ λ°λ³΅νλλ‘ νλ©΄μ, νμ¬ μ²λ¦¬ν΄μ€μΌ νλ ν λ§ν λ€λ§ μ²λ¦¬νλλ‘ νλ€. κ·Έλ¦¬κ³ μ΄ κ³Όμ μμ μ΅μ ν λ§ν μ κ°μλ₯Ό λ°ννλ€.
μ΅μ ν λ§ν μ κ°μκ° λͺ©νμΉ(μ΅μ΄μΌ νλ ν λ§ν μ μ΄ κ°μ)μ λλ¬νλ©΄ whileλ¬Έμ λΉ μ Έλμμ timeμ μΆλ ₯νλ€.