|
//https://www.acmicpc.net/problem/2146
#include <iostream> |
#include <queue> |
using namespace std; |
bool map[100][100]; |
int visited[100][100]; |
int visited2[100][100]; |
int N, cnt; |
int min1=10001; |
|
int dy[4]={0,0,1,-1}; |
int dx[4]={1,-1,0,0}; |
|
void dfs(int y, int x, int land){ |
visited[y][x]=land; |
|
for(int i=0; i<4; i++){ |
int ny=y+dy[i]; |
int nx=x+dx[i]; |
|
if(ny>=0 && ny<N && nx>=0 && nx<N && !visited[ny][nx] && map[ny][nx]){ |
dfs(ny, nx, land); |
} |
} |
} |
|
void bfs(int land){ |
queue<int> q; |
|
//섬의 테두리 옆의 다리값을 1로 지정 & 다리 시작점 q에 넣음 |
for(int i=0; i<N; i++){ |
for(int j=0; j<N; j++){ |
if(visited[i][j]==land){ |
for(int k=0; k<4; k++){ |
int ny=i+dy[k]; |
int nx=j+dx[k]; |
|
if(ny>=0 && ny<N && nx>=0 && nx<N){ |
if(!map[ny][nx]){ |
q.push(ny*100+nx); |
visited2[ny][nx]=1; |
} |
} |
} |
} |
} |
} |
|
while(!q.empty()){ |
int nowy=q.front()/100; |
int nowx=q.front()%100; |
q.pop(); |
|
for(int i=0; i<4; i++){ |
int ny=nowy+dy[i]; |
int nx=nowx+dx[i]; |
|
if(ny>=0 && ny<N && nx>=0 && nx<N){ |
if(visited[ny][nx] != land && visited[ny][nx]>0){ |
if(visited2[nowy][nowx]<min1){ |
min1=visited2[nowy][nowx]; |
} |
return; |
} |
|
if(!map[ny][nx] && !visited2[ny][nx]) { |
q.push(ny*100+nx); |
visited2[ny][nx]=visited2[nowy][nowx]+1; |
} |
} |
} |
} |
} |
|
int main(){ |
cin >> N; |
|
for(int i=0; i<N; i++) |
for(int j=0; j<N; j++) |
cin >> map[i][j]; |
|
for(int i=0; i<N; i++) |
for(int j=0; j<N; j++) |
if(visited[i][j]==0 && map[i][j]==1){ |
cnt++; |
dfs(i,j,cnt); |
} |
|
for(int i=1; i<cnt; i++) |
bfs(i); |
|
cout << min1; |
} |