ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 연구소
    백준알고리즘 2019. 7. 17. 02:23
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<utility>
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    int n, m;
    int a[9][9];
    vector<pair<int, int>> v1;
    vector<pair<int, int>> v2;
    vector<pair<int, int>> v3;
    int d[9][9];
    bool f[9][9];
    int dx[] = {0,0,-1,1};
    int dy[] = {1,-1,0,0};
    
    void re(){
        for(int i = 0; i < v1.size(); i++){
            int x = v1[i].first;
            int y = v1[i].second;
            d[x][y] = 0;
        }
        for(int i = 0; i < v2.size(); i++){
            int x = v2[i].first;
            int y = v2[i].second;
            d[x][y] = 2;
        }
        for(int i = 0; i < v3.size(); i++){
            int x = v3[i].first;
            int y = v3[i].second;
            d[x][y] = 1;
        }
        for(int i = 0; i < 9; i ++){
            for(int j =0; j < 9; j++)
                f[i][j] = false;
        }
    }
    
    void bfs(int x, int y){
        queue<pair<int, int>> q;
        q.push(make_pair(x, y));
        d[x][y] = 2;
        f[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 < m) {
                    if (f[nx][ny] == false) {
                        if (d[nx][ny] == 0) {
                            f[nx][ny] = true;
                            d[nx][ny] = 2;
                            q.push(make_pair(nx, ny));
                        }
                    }
                }
            }
        }
    }
    
    int main(){
        scanf("%d %d", &n, &m);
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m;j++){
                scanf("%d", &a[i][j]);
                if(a[i][j] == 0) v1.push_back(make_pair(i,j));
                if(a[i][j] == 2) v2.push_back(make_pair(i,j));
                if(a[i][j] == 1) v3.push_back(make_pair(i,j));
            }
        }
        re();
        vector<int> s;
        for(int i = 0; i< v1.size() - 3; i++){
            s.push_back(0);
        }
        s.push_back(1);
        s.push_back(1);
        s.push_back(1);
        int result = 0;
        vector<int> qq;
        do{
            int zero = 0;
            vector<pair<int, int>> il;
            for(int i = 0; i < s.size(); i++){
                if(s[i] == 1){
                    int x = v1[i].first;
                    int y = v1[i].second;
                    il.push_back(make_pair(x,y));
                }
            }
    
            for(int i = 0; i < il.size(); i++){
                d[il[i].first][il[i].second] = 1;
            }
    
            for(int i = 0; i < v2.size(); i++){
                bfs(v2[i].first, v2[i].second);
            }
            for(int i = 0; i < n; i++){
                for(int j = 0; j < m; j++){
                    if(d[i][j] == 0)
                        zero +=1;
                }
            }
            if(zero > result)
                result = zero;
            qq.push_back(zero);
            re();
        }while(next_permutation(s.begin(), s.end()));
        //for(int i = 0; i < qq.size(); i++)
          //  printf("%d", qq[i]);
        //printf("\n");
    
        printf("%d\n", result);
        return 0;
    
    
    }

    BFS로만 하다가, 배열크기가 최대 8,8이길래 브루트포스 곁들여서 진행함

    permutation 돌려서, 0의 위치 를 세개 계속 1로바꿔주고 진행해봄

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

    시험 감독  (0) 2019.07.17
    유기농 배추  (0) 2019.07.17
    기지국  (0) 2019.07.14
    욕심쟁이 판다  (0) 2019.07.13
    동물원  (0) 2019.07.13

    댓글

Designed by Tistory.