#include <bits/stdc++.h>
using namespace std;

#define X first
#define Y second

int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int n;
int board[105][105];
int vis[105][105];

int main() {
    cin.tie(0);
    int res=100000;
    int island=0;
    cin >> n;
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            cin >> board[i][j];
        }
    }
     for(int j=0; j<n; j++) {
        fill(vis[j],vis[j]+n,-1);
     }
    //섬 번호 매기기
    queue<pair<int,int>> Q;
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            if(board[i][j]==1 && vis[i][j]==-1) {
                island++;
                board[i][j]=island;
                Q.push({i,j});
                while(!Q.empty()) {
                    auto cur = Q.front();Q.pop();
                    for(int idx=0; idx<4; idx++) {
                        int nx=cur.X+dx[idx];
                        int ny=cur.Y+dy[idx];
                        if(nx<0 || nx>=n || ny<0 || ny>=n) continue;
                        if(board[nx][ny]==0 || vis[nx][ny]!=-1) continue;

                        vis[nx][ny]=0;
                        board[nx][ny]=island;
                        Q.push({nx,ny});
                    }
                }
            }
        }
    }
    // 다리 만들기
   
    for(int i=1; i<=island; i++) {
        queue<pair<int,int>> q;
        //새로운 섬마다 초기화
        for(int k=0; k<n; k++) fill(vis[k],vis[k]+n,-1);
        //섬 좌표 방문 표시
        for(int r=0; r<n; r++) {
            for(int c=0; c<n; c++) {
               if(board[r][c]==i) {
                   vis[r][c]=0;
                   q.push({r,c});
               } 
            }
        }
                while(!q.empty()) {
                    auto cur = q.front();q.pop();
                    for(int idx=0; idx<4; idx++) {
                        int nx=cur.X+dx[idx];
                        int ny=cur.Y+dy[idx];

                        //범위 밖 이고 방문함 
                        if(nx<0 || nx>=n || ny<0 || ny>=n) continue;
                        if(vis[nx][ny]!=-1) continue;

                        //다른섬 만남
                        if(board[nx][ny]!=0 && board[nx][ny]!=board[cur.X][cur.Y]) {
                            res=min(vis[cur.X][cur.Y],res);
                            while(!q.empty()) q.pop();
                            break;
                        }                        
                        
                        //강이고 방문 된적 없음
                        if(board[nx][ny]==0) {
                            vis[nx][ny]=vis[cur.X][cur.Y]+1;
                            q.push({nx,ny});
                        }
                    }
                }
            }
     cout << res;
    return 0;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: