오늘의 알고리즘
[C++] 백준 2239 스도쿠
하늘하늘 .
2022. 11. 25. 21:52
#include <iostream>
#include <string.h>
int sudoku[9][9] = {};
bool row[9][9] = {};
bool col[9][9] = {};
bool visit[9][9] = {};
void DFS(int count)
{
int x = count / 9;
int y = count % 9;
if (count == 81)
{
for (int i = 0; i < 9; ++i)
{
for (int j = 0; j < 9; ++j)
{
std::cout << sudoku[i][j];
}
std::cout << "\n";
}
exit(0);
}
if (!sudoku[x][y])
{
for (int i = 1; i <= 9; ++i)
{
if (!row[x][i] && !col[y][i] && !visit[(x / 3) * 3 + (y / 3)][i])
{
row[x][i] = true;
col[y][i] = true;
visit[(x / 3) * 3 + (y / 3)][i] = true;
sudoku[x][y] = i;
DFS(count + 1);
sudoku[x][y] = 0;
row[x][i] = false;
col[y][i] = false;
visit[(x / 3) * 3 + (y / 3)][i] = false;
}
}
}
else
DFS(count + 1);
}
int main(void)
{
for (int i = 0; i < 9; ++i)
{
std::string s = {};
std::cin >> s;
for (int j = 0; j < s.size(); ++j)
{
sudoku[i][j] = s[j] - '0';
if (sudoku[i][j])
{
row[i][sudoku[i][j]] = true;
col[j][sudoku[i][j]] = true;
visit[(i / 3) * 3 + (j / 3)][sudoku[i][j]] = true;
}
}
}
DFS(0);
return 0;
}
스도쿠는 가로 세로 3x3 박스에 한 가지의 수만 있어야 합니다.
row는 가로, col는 세로, visit은 3x3 박스를 의미합니다.
x는 가로, y는 세로 현재 세로를 의미합니다.
그렇기 대문에 모든 카운팅을 전부 다 돌아야합니다.
0, 0 번부터 계속해서 진행하면서 없는 경우 넣어주고 계속해서 돌려줍니다.
여러 가지의 상황이 나올 수 있기 때문에 exit(0) 함수로 프로세스 종료를 해줘야합니다.