이어지는 브루트포스문제이며 백트래킹으로 적절한 조건을 잘 찾아야 한다. 스도쿠문제는 1)같은 열, 2)같은 행, 3)3x3 정사각형 안에 같은 숫자가 존재해서는 안된다는 조건이 있다. 따라서 각 조건에 따라 if조건문을 만들어야 한다.
int 반환형을 void 반환형으로 바꿀수는 없는지 시도중이다.
아래는 int 반환형 DFS이다.
#include <iostream>
using namespace std;
int map[10][10];
int c[10][10];
int c2[10][10];
int c3[10][10];
int DFS(int L) {
if (L == 81) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout << map[i][j] << ' ';
}
cout << '\n';
}
return 1;
}
else {
int x = L / 9;
int y = L % 9;
if (map[x][y] != 0) return DFS(L + 1);
else {
for (int i = 1; i <= 9; i++) {
if (c[x][i] == 0 && c2[y][i] == 0 && c3[(x / 3) * 3 + y / 3][i] == 0) { //즉, 놓을 수 있으면
c[x][i] = 1;
c2[y][i] = 1;
c3[(x / 3) * 3 + y / 3][i] = 1;
map[x][y] = i;
if(DFS(L + 1)==1) return 1;
map[x][y] = 0;
c[x][i] = c2[y][i] = c3[(x / 3) * 3 + y / 3][i] = 0;
}
}
}
}
return 0;
}
int main() {
ios_base::sync_with_stdio(false);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> map[i][j];
if (map[i][j] != 0) {
c[i][map[i][j]] = 1;
c2[j][map[i][j]] = 1;
c3[(i / 3) * 3 + j / 3][map[i][j]] = 1;
}
}
}
DFS(0);
return 0;
}