import sys
from collections import deque
N = int(input())
_map = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
dr = [1, -1, 0, 0]
dc = [0, 0, 1, -1]
# ์ฌ ๋ผ๋ฒจ๋ง
def labeling(label):
while queue:
r, c = queue.popleft()
for i in range(4):
nr = dr[i] + r
nc = dc[i] + c
if 0 <= nr < N and 0 <= nc < N and _map[nr][nc] == 1:
_map[nr][nc] = label
queue.append([nr, nc])
label = -1
queue = deque([])
for r in range(N):
for c in range(N):
if _map[r][c] == 1:
_map[r][c] = label
queue.append([r, c])
labeling(label)
label -= 1
# ์ก์ง ์ขํ ๊ตฌํ๊ธฐ
for r in range(N):
for c in range(N):
if _map[r][c] < 0:
queue.append([r, c])
ans = 1e9
distanceMap = [[0] * N for _ in range(N)]
def bfs():
global ans
while queue:
r, c = queue.popleft()
for i in range(4):
nr = dr[i] + r
nc = dc[i] + c
if 0 <= nr < N and 0 <= nc < N:
# ๊ตฌํ ์ก์ง ์ขํ๊ฐ ๋ฐ๋ค์ ์ธ์ ํ ๊ฒฝ์ฐ์๋ง ๋ก์ง ์คํ
if _map[nr][nc] == 0:
queue.append([nr, nc])
_map[nr][nc] = _map[r][c]
distanceMap[nr][nc] = distanceMap[r][c] + 1
# ๋ค๋ฅธ ์ก์ง์์ ์ถ๋ฐํ ์์ญ๊ณผ ๋ง๋ ๊ฒฝ์ฐ ( ๋ค๋ฅธ ์ก์ง์์ ์ถ๋ฐํ ์์ญ์ ์์๋ก ์
๋ ฅ๋๋ฏ๋ก)
elif _map[nr][nc] < 0 and _map[nr][nc] != _map[r][c]:
ans = min(ans,distanceMap[nr][nc]+distanceMap[r][c])
bfs()
print(ans)
๋ฌธ์ ์ ๊ทผ ๋ฐฉ๋ฒ
1. bfs ํ์์ ๊ตฌํํ labeling() ํจ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ์ฌ๋ง๋ค ์์๋ก ๋ผ๋ฒจ๋ง์ ํ๋ค.
2. ์์๋ก ๋ผ๋ฒจ๋ง ํ์ผ๋ฏ๋ก ๋งต ์ ์ฒด๋ฅผ ํ์ํ๋ฉด์ ๊ฐ์ด ์์์ธ ์ขํ๋ค์ ๋ชจ๋ queue์ ๊ธฐ๋กํ๋ค.
3. ์ก์ง ์ขํ๋ก bfs()๋ฅผ ํ๋๋ฐ, ์ด๋ํ ๊ฐ์ด 0์ธ๊ฒฝ์ฐ์๋ง ๋ค์ ํ์์ ์งํํ๋ค.
0์ด์๋ ์ขํ(๋ฐ๋ค)์๋, _map์ ์ก์ง ๋ฒํธ๋ฅผ ๊ธฐ๋กํ๊ณ distanceMap์๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ๋ค.
4. ๋ง์ฝ ํ์ ์ค์ ํ์์ ์์ํ _map์ขํ์ ํ์์ ํ _map ์ขํ ๊ฐ์ด ๋ค๋ฅด๋ค๋ ๊ฒ์
๊ฐ๊ฐ ๋ค๋ฅธ ์ก์ง์์ ์ถ๋ฐํ ํ์ ์ขํ๋ผ๋ ๋ป์ด๋ฏ๋ก ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ๋ค.
5. ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.