题目:
代码如下:
#include<bits/stdc++.h>
using namespace std;
char a[10][10];
bool vx[10][10],vy[10][10],vv[10][10],f;//分别对行,列,3*3区域进行判重
void dfs(int x,int y)
{
if(f) return;//保证只打印一个9*9
if(x == 9){
f = true;
for(int i = 0;i < 9;i++){
for(int j = 0;j < 9;j++){
if(j) cout << " " << a[i][j];
else cout << a[i][j];
}
cout << endl;
}
return;
}
if(y == 9){dfs(x + 1,0);return;}//列已满,进入下一行
if(a[x][y] != '*'){dfs(x,y + 1);return;}//该位置已有数字
for(int i = 1;i <= 9;i++){
if(!vx[x][i] && !vy[y][i] && !vv[x / 3 * 3 + y / 3][i]){
a[x][y] = i + '0';
vx[x][i] = true;
vy[y][i] = true;
vv[x / 3 * 3 + y / 3][i] = true;
dfs(x,y + 1);
a[x][y] = '*';
vx[x][i] = false;
vy[y][i] = false;
vv[x / 3 * 3 + y / 3][i] = false;
}
}
}
int main()
{
for(int i = 0;i < 9;i++)
for(int j = 0;j < 9;j++)
cin >> a[i][j];
//把已填的数判重判掉
for(int i = 0;i < 9;i++){
for(int j = 0;j < 9;j++){
if(a[i][j] != '*'){
vx[i][a[i][j] - '0'] = true;
vy[j][a[i][j] - '0'] = true;
vv[i / 3 * 3 + j / 3][a[i][j] - '0'] = true;
}
}
}
dfs(0,0);
return 0;
}
此题与八皇后问题有些类似,代码注释已标。