아무코딩

[백준 2580] 스도쿠 본문

알고리즘/백준

[백준 2580] 스도쿠

동 코 2020. 5. 11. 01:39

문제풀이

너무 꼬아서 생각했다.. 

내가 너무 쉬운 스도쿠만 풀었는지 확실하게 유니크한 값들을 채워나가면 공백이 줄지 알고 공백들을 계속 돌려 유니크한 1개의 값을 채워나가는 방식으로 생각했는데 예외가 너무 많았다. 고려할게 2가지 이상인게 모두일때 그 방법은 무한루프 상태가 된다. 

 

그래서 남들 처럼 dfs 방법으로 풀었다.

 

자리확인은 원래 bool 배열로 해도 됐으나 그전에 짠 비트마스크 코드가 아까워 그대로 사용하였다. 하고보니 그냥 간단한 dfs문제였다.

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <stdlib.h>
 
using namespace std;
 
queue<pair<int,int>> q;
 
int Map[9][9];
int set_row[9];
int set_col[9];
int set_square[3][3];
 
bool isPossible(int row, int col,int num){
    int union_num = set_row[row] | set_col[col] | set_square[row/3][col/3];
    
    if(union_num & (1<<num))
        return false;
    return true;
}
 
void dfs(int cnt){
    if(cnt==81){
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                printf("%d ",Map[i][j]);
            }
            printf("\n");
        }
        exit(0);
    }
    
    int row = cnt/9;
    int col = cnt%9;
    
    if(Map[row][col])
        dfs(cnt+1);
    else{
        for(int i=1; i<=9;i++){
            if(isPossible(row,col,i)){
                Map[row][col] = i;
                set_row[row]+= (1<<i);
                set_col[col]+= (1<<i);
                set_square[row/3][col/3+= (1<<i);
                dfs(cnt+1);
                Map[row][col] = 0;
                set_row[row]-= (1<<i);
                set_col[col]-= (1<<i);
                set_square[row/3][col/3-= (1<<i);
                
            }
        }
    }
    
    
}
 
int main() {
    
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            int input;
            scanf("%d",&input);
            Map[i][j] = input;
            if(input!=0){
                set_row[i]+= (1<<input);
                set_col[j]+= (1<<input);
                set_square[i/3][j/3+= (1<<input);
            }
        }
    }
    dfs(0);
 
    
    return 0;
}
 
cs
 
 

문제 링크 : www.acmicpc.net/problem/2580

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

 

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

[백준 2352] 반도체 설계  (0) 2020.05.15
[백준 17281] 야구  (0) 2020.05.12
[백준 1300] k번째수  (0) 2020.05.08
[백준 2252] 줄세우기  (0) 2020.05.08
[백준 14499] 주사위 굴리기  (0) 2020.05.06
Comments