ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다리만들기
    백준알고리즘 2019. 8. 14. 17:55
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<queue>
    
    using namespace std;
    
    int n;
    int map[100][100];
    int mapping[100][100];
    bool d[100][100];
    int dx[] = {0,0,1,-1};
    int dy[] = {1,-1,0,0};
    int ans = 100000000;
    
    
    void bfs(int x, int y, int value){
    
        queue<pair<int,int>> q;
        q.push({x,y});
        map[x][y] = 0;
        d[x][y] = true;
        while(!q.empty()){
            x = q.front().first; y = q.front().second;
            q.pop();
            for(int i = 0; i < 4; i++){
                int nx = x+dx[i]; int ny = y+dy[i];
                if(nx >=0 && nx < n && ny>= 0 && ny<n){
                    if(mapping[nx][ny] != value){
                        if(d[nx][ny] == false){
                            if(mapping[nx][ny] != 0 && mapping[nx][ny] != value){
                                ans = ans > map[x][y] ? map[x][y] : ans;
                            }
                            map[nx][ny] = map[x][y] + 1;
                            d[nx][ny] = true;
                            q.push({nx,ny});
                        }
                    }
                }
            }
        }
    
    }
    
    void make_map(int x, int y, int value){
        queue<pair<int, int>> q;
        q.push({x,y});
        mapping[x][y] = value;
        d[x][y] = true;
        while(!q.empty()){
            x = q.front().first;  y = q.front().second;
            q.pop();
            for(int i = 0; i < 4; i++){
                int nx = x+dx[i]; int ny = y+dy[i];
                if(nx >=0 && nx < n && ny>= 0 && ny<n){
                    if(map[nx][ny] == 1){
                        if(d[nx][ny] == false){
                            mapping[nx][ny] = value;
                            d[nx][ny] = true;
                            q.push({nx,ny});
                        }
                    }
                }
            }
        }
    }
    
    int main(){
        scanf("%d", &n);
    
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                scanf("%d", &map[i][j]);
            }
        }
    
        int value = 1;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(map[i][j] == 1){
                    if(d[i][j] == false){
                        make_map(i,j, value);
                        value++;
                    }
                }
            }
        }
    
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(mapping[i][j] != 0) {
                    memset(d, false, sizeof(d));
                    memset(map, 0, sizeof(d));
                    bfs(i, j, mapping[i][j]);
                }
            }
        }
        printf("%d\n", ans);
    
    }

    '백준알고리즘' 카테고리의 다른 글

    부분합  (0) 2019.08.26
    나이트의 이동  (0) 2019.08.14
    뿌요뿌요  (0) 2019.08.14
    배열 돌리기 4  (0) 2019.08.13
    연구소 3  (0) 2019.08.11

    댓글

Designed by Tistory.