์ธ๋ถ ๊ณต๊ธฐ์ 2๋ฉด ์ด์ ๋ง๋ฟ์ ์น์ฆ๋ค์ ์ฌ๋ผ์ง๊ฒ ๋๋ค. ๋ชจ๋ ์น์ฆ๊ฐ ์ฌ๋ผ์ง๋๋ฐ ์ผ๋ง์ ์๊ฐ์ด ์์๋๋์ง ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
์ต์ ์๊ฐ์ ๊ตฌํ๋ฉฐ ๊ทธ๋ํ ํ์์ด๊ธฐ ๋๋ฌธ์ ๋๋น ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค. ์ด๋ ์ธ๋ถ ๊ณต๊ธฐ๋ผ๋ ๊ฐ๋ ์ด ๋ญ์ง ์ด๋ป๊ฒ ๊ตฌํด์ผํ๋์ง ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ๋ ๊ฒ ์ข ์ค๋๊ฑธ๋ ธ๋ค.
์ฐ์ ํ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ์งํํ๋ค.
- ์ด์ ์ ์ธ๋ถ ๊ณต๊ธฐ๋ค์ ํ์ ๋ด๊ณ ๋ค์ ์ธ๋ถ ๊ณต๊ธฐ๋ค์ ์ฐพ๋๋ค.
- ์ธ๋ถ ๊ณต๊ธฐ๋ค์ ํ์ ๋ฃ๊ณ ๋ง๋ฟ์ ์น์ฆ๋ค์ ์ฐพ๋๋ค. ์ธ๋ถ ๊ณต๊ธฐ๋ค๊ณผ ๋ง๋ ๋๋ง๋ค ์น์ฆ๋ค์ visited ๊ฐ์ +1 ํด์ค๋ค.
- ์ ์ฒด ๋ฐฐ์ด์ ๋๋ฉด์ ์ธ๋ถ ๊ณต๊ธฐ๋ค๊ณผ ๋ง๋ ๊ฐ์ด 2์ด์์ธ ์น์ฆ๋ค์ ์ฐพ์์ ๋ฐํํ๋ค. ๋ค์ ์ธ๋ถ ๊ณต๊ธฐ๊ฐ ๋๋ ๊ฐ๋ค์ด ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๋ด๋ถ ๊ณต๊ธฐ๋ผ๋ ๊ฐ๋ ์ด ๋ค์ด๊ฐ๋ฉด์ ์ข ๊ผฌ์๋ค. ์ธ๋ถ ๊ณต๊ธฐ๊ฐ ์น์ฆ๋ฅผ ๋ น์ด๋ฉด์ ์น์ฆ์ ๋ด๋ถ์ ์๋ ๋ด๋ถ ๊ณต๊ธฐ๋ค๊ณผ ๋ง๋๊ฒ ๋๋๋ฐ, ๋ด๋ถ ๊ณต๊ธฐ๋ค์ ์ธ๋ถ ๊ณต๊ธฐ์ ๋ง๋๊ฒ ๋๋ฉด ๊ณง๋ฐ๋ก ๋ง๋ฟ์ ์น์ฆ๋ค์ ์ฌ๋ผ์ง๊ฒ ํ ์ ์๋ค. ์ฆ, ์ด๋ฏธ ํ ๋ฒ ์น์ฆ๋ค์ ์ฌ๋ผ์ง๊ฒ ํ ํ, ์ธ๋ถ ๊ณต๊ธฐ์ ๋ง๋ฟ์์ ์ฌ๋ผ์ง๊ฒ ํ ์น์ฆ๋ค์ ๋ค์ ๋ฒ์ ์ธ๋ถ ๊ณต๊ธฐ๊ฐ ๋๋๋ฐ, ์ด๋์ ์ธ๋ถ ๊ณต๊ธฐ๋ค๊ณผ ๋ง๋๊ฒ ๋๋ ์น์ฆ์ ๋ด๋ถ์ ์๋ ๋ด๋ถ ๊ณต๊ธฐ๋ค์ ํ์ ๋ด๊ฒจ์ ๋ค์ ๋ฒ ์ฐ์ฐ์ผ๋ก ๋์ด๊ฐ๋ ๊ฒ ์๋๋ผ, ์ด๋์ ์ธ๋ถ ๊ณต๊ธฐ๋ค๊ณผ ํฉ์ณ์ ธ์ ๋ง๋ฟ์ ์น์ฆ๋ค์ ์ฌ๋ผ์ง๊ฒ ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์์ ์ด์ ์ ๋ฐ์๋ ์ธ๋ถ ๊ณต๊ธฐ๋ค์ ์๋กญ๊ฒ ์ฐพ์ ๋ด๋ถ ๊ณต๊ธฐ์ ์์น๋ค์ ํฉ์ณ์ ๋ง๋ฟ์ ์น์ฆ๋ฅผ ์ฌ๋ผ์ง๊ฒ ํ๋ฉด ๋๋ค.
# ์น์ฆ
import sys
sys.stdin = open('input.txt')
from collections import deque
def is_valid(x, y):
return 0 <= x < N and 0 <= y < M
def bfs(queue):
# ์ธ๋ถ ๊ณต๊ธฐ ์ฐพ๊ธฐ
next_queue = queue.copy()
while queue:
x, y = queue.popleft()
for k in range(4):
nx, ny = x + dx[k], y + dy[k]
if not is_valid(nx, ny) or visited[nx][ny] or cheeze[nx][ny]:
continue
next_queue.append((nx, ny))
queue.append((nx, ny))
visited[nx][ny] = 1
# ๋ง๋ฟ์ ์น์ฆ ์ฐพ๊ธฐ
while next_queue:
x, y = next_queue.popleft()
for k in range(4):
nx, ny = x + dx[k], y + dy[k]
if not is_valid(nx, ny) or not cheeze[nx][ny]:
continue
visited[nx][ny] += 1
cheeze_queue = deque()
for x in range(N):
for y in range(M):
if cheeze[x][y] and visited[x][y] >= 2:
cheeze_queue.append((x, y))
cheeze[x][y] = 0
# for row in cheeze:
# print(*row)
# print(cheeze_queue)
return cheeze_queue
def is_all_find():
for row in cheeze:
if sum(row):
return False
return True
N, M = map(int, input().split())
cheeze = [list(map(int, input().split())) for _ in range(N)]
queue = deque([(0, 0)])
out_air = deque()
visited = [[0] * M for _ in range(N)]
dx = (0, 1, -1, 0)
dy = (1, 0, 0, -1)
hour = 0
while not is_all_find():
queue = bfs(queue)
hour += 1
print(hour)