数独游戏只有一个规则:将 9 × 9 9\times9 9×9 的矩阵填满,使得每一行,每一列,和每一个小的九宫格恰好包含 1 ∼ 9 1\sim9 1∼9 这 9 9 9 个数字。
你需要编写一个程序填写不完整的数独。
解
直接DFS。
代码
懒,直接动手打了表。。
#include<cstdio>
int k[20][20], a[20][20], l[20][20], h[20][20], jz[20][20], flag;
int read(){
char c = getchar();
while((c > '9' || c < '0') && c != '?') c = getchar();
if(c == '?') return 0;
else return c - 48;
}
void csh(){
k[1][1] = k[1][2] = k[1][3] = k[2][1] = k[2][2] = k[2][3]
= k[3][1] = k[3][2] = k[3][3] = 1;
k[4][1] = k[4][2] = k[4][3] = k[5][1] = k[5][2] = k[5][3]
= k[6][1] = k[6][2] = k[6][3] = 4;
k[7][1] = k[7][2] = k[7][3] = k[8][1] = k[8][2] = k[8][3]
= k[9][1] = k[9][2] = k[9][3] = 7;
k[1][4] = k[1][5] = k[1][6] = k[2][4] = k[2][5] = k[2][6]
= k[3][4] = k[3][5] = k[3][6] = 2;
k[4][4] = k[4][5] = k[4][6] = k[5][4] = k[5][5] = k[5][6]
= k[6][4] = k[6][5] = k[6][6] = 5;
k[7][4] = k[7][5] = k[7][6] = k[8][4] = k[8][5] = k[8][6]
= k[9][4] = k[9][5] = k[9][6] = 8;
k[1][7] = k[1][8] = k[1][9] = k[2][7] = k[2][8] = k[2][9]
= k[3][7] = k[3][8] = k[3][9] = 3;
k[4][7] = k[4][8] = k[4][9] = k[5][7] = k[5][8] = k[5][9]
= k[6][7] = k[6][8] = k[6][9] = 6;
k[7][7] = k[7][8] = k[7][9] = k[8][7] = k[8][8] = k[8][9]
= k[9][7] = k[9][8] = k[9][9] = 9;
}
void dfs(int x, int y){
if(x == 10){
flag = 1;
return;
}
if(a[x][y] != 0){
if(y+1 <= 9) dfs(x, y+1);
else dfs(x+1, 1);
return;
}
for(int i = 1; i <= 9; ++i)
if(l[y][i] == 0 && h[x][i] == 0 && jz[k[x][y]][i] == 0){
l[y][i] = 1;
h[x][i] = 1;
jz[k[x][y]][i] = 1;
a[x][y] = i;
if(y+1 <= 9) dfs(x, y+1);
else dfs(x+1, 1);
if(flag == 1) return;
a[x][y] = 0;
l[y][i] = 0;
h[x][i] = 0;
jz[k[x][y]][i] = 0;
}
}
int main(){
freopen("sudoku.in","r",stdin);
freopen("sudoku.out","w",stdout);
csh();
for(int i = 1; i <= 9; ++i){
for(int j = 1; j <= 9; ++j){
a[i][j] = read();
if(a[i][j] != 0){
l[j][a[i][j]] = 1;
h[i][a[i][j]] = 1;
jz[k[i][j]][a[i][j]] = 1;
}
}
}
dfs(1, 1);
for(int i = 1; i <= 9; ++i){
for(int j = 1; j <= 9; ++j)
printf("%d", a[i][j]);
printf("\n");
}
}