# PROBLEM - 빙산
# TIER - G4
# NUMBER - 2573
# DATE - 2022-08-05 23:44
# IDEA - 이건 2덩이인지 판별 함수, 상하좌우 0개수 카운팅 함수 2개 만들어서
# BFS 하면 될듯
import sys
import collections
import copy
input = sys.stdin.readline
N, M = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
flag = 0
year = 0
def counting(nowX, nowY): # 주면 상하좌우의 0개수에 따라 녹일 개수 return
count = 0
for i in range(4):
nx, ny = nowX+dx[i], nowY+dy[i]
if 0 <= nx < N and 0 <= ny < M and graph[nx][ny] == 0:
count += 1
return count
def melt(): # counting 함수로 녹인 graph return
global graph
glacier = copy.deepcopy(graph)
for i in range(N):
for j in range(M):
if graph[i][j] != 0:
glacier[i][j] -= counting(i, j)
if glacier[i][j] < 0:
glacier[i][j] = 0
graph = glacier
def check(): # while문 계속 돌리면서 녹일지 return
global flag
answer = []
gray_scale = copy.deepcopy(graph)
for i in range(N):
for j in range(M):
if gray_scale[i][j] != 0:
gray_scale[i][j] = 1
for i in range(N):
for j in range(M):
if gray_scale[i][j] == 1:
bfs(gray_scale, i, j) # 0, 1로만 이루어진 gray_scale 생성
answer.append('엄준식') # 조각 개수만큼 answer에 엄준식 추가
if len(answer) == 1: # 한조각이라면 -> 계속하기
return True
elif len(answer) == 0: # 동시에 녹는다면? -> flag 들어주기
flag = 1
return False # 반복 종료
else:
return False # 여러조각으로 쪼개진다면 -> 반복 종료
def bfs(gray_scale, startX, startY): # 몇조각인지 return
queue = collections.deque([(startX, startY)]) # 0, 1 로만 이루어진 gray_scale 배열로 조각 개수 구함
gray_scale[startX][startY] = 0
while queue:
x, y = queue.popleft()
for i in range(4):
nx, ny = x+dx[i], y+dy[i]
if 0 <= nx < N and 0 <= ny < M and gray_scale[nx][ny] == 1:
gray_scale[nx][ny] = 0
queue.append((nx, ny))
while check(): # check 함수로 조각 개수 구해가면서
melt() # 녹이기
year += 1 # 년수 추가
print([year, 0][flag]) # 만약 동시에 녹으면 flag = 1 만들어서 0 출력
빡구현때매 스트레스받아요