题目是数独,想到了深度优先搜索一个个地验证;
做出来后,妈妈再也不用担心我玩数独被人虐了
#include <iostream>
using namespace std;
int num[10][10];
int x,y;
bool judge(int l,int r,int a){ //用于判断同一行,同一列,同一个小九宫格内,是否已经存在相同的
for(int i=0;i<9;i++){ // 同一行,同一列的判断
if(num[i][r]==a)return false;
if(num[l][i]==a)return false;
}
int b=(l/3)*3,c=(r/3)*3; //同一个小九宫格的判断,(b,c)就是小九宫格的第一格坐标
for(int i=b;i<b+3;i++){
for(int j=c;j<c+3;j++){
if(num[i][j]==a)return false;
}
}
return true;
}
bool dfs(int x,int y){
int i,m,nx=10,ny=10;
bool ok=false;
for(m=y;m>=0;m--){
for(int d=8;d>=0;d--){
if(0==num[m][d]&&!(x==d&&y==m)){
nx=d;
ny=m;
ok=true;
break;
}
}
if(ok)break;
}
for(i=1;i<10;i++){
if(!judge(y,x,i))continue;
num[y][x]=i;
if(10==nx)return true;
if(!dfs(nx,ny)){continue;} //递归
return true;
}
num[y][x]=0; //这一层失败,则重来
return false;
}
int main()
{ int n;
cin>>n;
char ch;
while(n--){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cin>>ch; //以字符形式输入,然后转化为数字
num[i][j]=ch-48;
if(0==num[i][j]){
x=j;
y=i;
}
}
}
dfs(x,y); //调用函数
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cout<<num[i][j];
}
cout<<endl;
}
}
return 0;
}