Baekjoon 2580 (스도쿠)
Baekjoon 2580, 백준 2580 문제의 본인 풀이입니다!
문제는 아래의 링크에서 확인할 수 있습니다.
문제 보기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
77
78
79
80
81
82
83
// 9*9 스도쿠 판을 이중배열로 만들고 0으로 초기화
int sudoku[9][9] = { 0, };
// 행, 열, 사각형에 각각 숫자가 있는지 확인. ex) 3번째 열에 5가 있으면 row[3][5]=true.
// 기본값은 모두 false (0)
bool row[9][10] = { 0, };
bool col[9][10] = { 0, };
bool square[9][10] = { 0, };
// 3*3 사각형으로 쪼갤 때, 몇 번째 위치에 있는지 반환
int SquareNum(int x, int y) {
return (x/3)*3 + (y/3);
}
// 마지막에 스도쿠 출력하는 함수
int printSudo() {
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
printf("%d ",sudoku[i][j]);
}
printf("\n");
}
}
// 스도쿠 푸는 함수 (백트래킹 사용). k가 채워넣은 칸 수
void makeSudo(int k){
if(k==81) {
printSudo();
exit(0);
}
// k번째 입력되는 값은 sudoku[x][y]
int x = k/9, y = k%9;
// 입력된 값이 0이 아니면 다음 번호로 넘어가면 됨
if(sudoku[x][y] != 0) makeSudo(k+1);
// 입력된 값이 0일 때
else {
for(int i=1; i<=9; i++){
// row, col, square 값이 모두 false 일 때
if( row[x][i]==false && col[y][i]==false && square[SquareNum(x,y)][i]==false ){
// row, col, square 값 true로 설정
row[x][i] = col[y][i] = square[SquareNum(x,y)][i] = true;
// sudoku[x][y] 에 i 대입 후 다음 단계(k+1)로
sudoku[x][y] = i;
makeSudo(k+1);
// 오류가 생긴 경우 백트래킹
sudoku[x][y] = 0;
row[x][i] = col[y][i] = square[SquareNum(x,y)][i] = false;
}
}
}
}
int main(){
// 스도쿠 입력 받기
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
scanf("%d", &sudoku[i][j]);
if(sudoku[i][j] != 0){
// 3개의 bool형 배열의 값을 true로 바꿔준다.
row[i][sudoku[i][j]] = true;
col[j][sudoku[i][j]] = true;
square[SquareNum(i,j)][sudoku[i][j]] = true;
}
}
}
makeSudo(0);
return 0;
}
exit(0) 부분을 return 0; 으로 두어,
분명 스도쿠 답이 모두 맞는데 왜 틀렸지? 하고 1시간 삽질한 문제.
Baekjoon 2580 (스도쿠)
http://yxxshin.github.io/2020/04/04/2020-04-04-Baekjoon-2580/




