[ 문제 ]
[ 접근방법 ]
1행 1열부터 순서대로 숫자를 대입해보고 퍼즐이 완성되면 함수를 종료한다.
used 배열을 통해 각 행, 각 열, 각 사각형에 숫자 중복이 없는지 체크한다.
used[ 0 ][ i ][ n ] = i 행에 숫자 n이 쓰였는지 여부.
used[ 1 ][ i ][ n ] = i 열에 숫자 n이 쓰였는지 여부.
used[ 2 ][ i ][ n ] = i번째 사각형에 숫자 n이 쓰였는지 여부.
[ 소스코드 ]
#include <iostream>
using namespace std;
int sudoku[9][9];
bool used[3][9][10];
int getSquareIndex(int x, int y){
return (x / 3) * 3 + (y / 3);
}
bool solve(int cell){
if(cell == 81) return true;
int row = cell / 9, col = cell % 9;
if(sudoku[row][col]) return solve(cell + 1);
for(int num = 1; num <= 9; num++){
if(!used[0][row][num] && !used[1][col][num] && !used[2][getSquareIndex(row, col)][num]){
used[0][row][num] = used[1][col][num] = used[2][getSquareIndex(row, col)][num] = true;
sudoku[row][col] = num;
if(solve(cell + 1)) return true;
sudoku[row][col] = 0;
used[0][row][num] = used[1][col][num] = used[2][getSquareIndex(row, col)][num] = false;
}
}
return false;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
for(int i = 0; i < 9; i++){
string rowInput;
cin >> rowInput;
for(int j = 0; j < 9; j++){
sudoku[i][j] = rowInput[j] - '0';
if(sudoku[i][j]){
used[0][i][sudoku[i][j]] = used[1][j][sudoku[i][j]] = used[2][getSquareIndex(i, j)][sudoku[i][j]] = true;
}
}
}
solve(0);
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
cout << sudoku[i][j];
}
cout << "\n";
}
return 0;
}
'PS' 카테고리의 다른 글
[ 백준 / C++ ] 1963 : 소수 경로 (0) | 2025.01.02 |
---|---|
[ 백준 / C++ ] 15681 : 트리와 쿼리 (0) | 2024.12.27 |
[ 백준 / C++ ] 1303 : 전쟁 - 전투 (0) | 2024.12.23 |
[ 백준 / C++ ] 2302 : 극장 좌석 (0) | 2024.12.20 |
[ 백준 / C++ ] 2331 : 반복수열 (0) | 2024.12.19 |