ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스도쿠 재풀이
    백준알고리즘 2019. 8. 10. 01:05
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<vector>
    #include<utility>
    #include<cstring>
    #include<cstdlib>
    
    using namespace std;
    
    int map[10][10];
    
    
    
    vector<pair<int, int>> v;
    
    
    
    void go(int idx){
        if(idx == v.size()){
            for(int i = 1; i <= 9; i++){
                for(int j = 1; j <= 9; j++){
                    printf("%d ", map[i][j]);
                }
                printf("\n");
            }
            exit(0);
        }
        int r[10];
        int c[10];
        int cir[10];
        memset(cir,0,sizeof(cir));
        memset(r,0,sizeof(r));
        memset(c,0,sizeof(c));
        for(int i = 1; i <= 9; i++){
            r[map[i][v[idx].second]] +=1;
            c[map[v[idx].first][i]] +=1;
        }
        int x=v[idx].first; int y =v[idx].second;
    
        if(y > 0 && y <=3 ){
            if(x >=1 && x<= 3){
                //1
                for(int i = 1; i <= 3; i++){
                    for(int j = 1; j <= 3; j++){
                        cir[map[i][j]] +=1;
                    }
                }
            }
            else if(x>3 && x<= 6){
                for(int i = 4; i <= 6; i++){
                    for(int j = 1; j <= 3; j++){
                        cir[map[i][j]]+=1;
                    }
                }
            }
            else if(x>6 && x<= 9){
                for(int i = 7; i <= 9; i++){
                    for(int j= 1; j <= 3; j++){
                        cir[map[i][j]]+=1;
                    }
                }
            }
        }
        else if(y> 3 && y<= 6){
            if(x >=1 && x<= 3){
                //1
                for(int i = 1; i<= 3; i++){
                    for(int j = 4; j <= 6; j++){
                        cir[map[i][j]]+=1;
                    }
                }
            }
            else if(x>3 && x<= 6){
                for(int i = 4; i<= 6; i++){
                    for(int j = 4; j <= 6; j++){
                        cir[map[i][j]]+=1;
                    }
                }
            }
            else if(x>6 && x<= 9){
                for(int i =7; i<= 9; i++){
                    for(int j = 4; j <= 6; j++){
                        cir[map[i][j]]+=1;
                    }
                }
            }
        }
        else if(y> 6 && y<=9){
            if(x >=1 && x<= 3){
                //1
                for(int i =1; i<= 3; i++){
                    for(int j = 7; j <= 9; j++){
                        cir[map[i][j]]+=1;
                    }
                }
            }
            else if(x>3 && x<= 6){
                for(int i =4; i<= 6; i++){
                    for(int j = 7; j <= 9; j++){
                        cir[map[i][j]]+=1;
                    }
                }
            }
            else if(x>6 && x<= 9){
                for(int i =7; i<= 9; i++){
                    for(int j = 7; j <= 9; j++){
                        cir[map[i][j]]+=1;
                    }
                }
            }
        }
        for (int i = 1; i <= 9; i++) {
            if (r[i] == 0 && c[i] == 0 && cir[i] == 0) {
                map[x][y] = i;
                go(idx + 1);
                map[x][y] = 0;
            }
        }
    
    }
    
    
    int main() {
        memset(map, 0, sizeof(map));
        int k = 0;
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                cin >> map[i][j];
                if (map[i][j] == 0)
                    v.push_back({i, j});
            }
        }
        go(0);
        return 0;
    }

     

    정말 시험에 나왔을때 해볼만한풀이

     

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

    연구소 3  (0) 2019.08.11
    종이조각  (0) 2019.08.11
    스도쿠  (0) 2019.08.09
    스타트와 링크  (0) 2019.08.08
    로봇청소기  (0) 2019.08.08

    댓글

Designed by Tistory.