补全4*4的数独
代码:
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int a[40][40],sum;
int hang[40][50],lie[40][50],f[20][20][50];
int jud(int i,int j,int k){
int h=(i/2),l=(j/2);
//cout<<i<<"="<<h<<" "<<j<<"="<<l<<endl;
if(hang[i][k] || lie[j][k] || f[h][l][k])return 0;
return 1;
}
int dfs(){
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(!a[i][j]){
int ha=i/2,l=j/2;
for(int h=1;h<=4;h++){
if(jud(i,j,h)){
a[i][j]=h;
hang[i][h]=1;
lie[j][h]=1;
f[ha][l][h]=1;
if(dfs())return 1;
a[i][j]=0;
hang[i][h]=0;
lie[j][h]=0;
f[ha][l][h]=0;
}
}
return 0;//错误点
}
}
}
return 1;
}
int main(){
int t;
int cur=1;
scanf("%d",&t);
while(t--){
memset(hang,0,sizeof(hang));
memset(lie,0,sizeof(lie));
memset(f,0,sizeof(f));
char c[50];
for(int i=0;i<4;i++){
cin>>c;
for(int j=0;j<4;j++){
if(c[j]=='*')a[i][j]=0;
else{
int k=c[j]-48,h=i/2,l=j/2;
a[i][j]=k;
hang[i][k]=1;
lie[j][k]=1;
f[h][l][k]=1;
}
}
}
dfs();
printf("Case #%d:\n",cur++);
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
printf("%d",a[i][j]);
}
printf("\n");
}
}
return 0;
}
/*
3
****
2341
4123
3214
*243
*312
*421
*134
*41*
**3*
2*41
4*2*
*/