题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3111
这个题目的大概意思是让在一行或一列或3*3的宫格里从1~9每个数只出现一次,就是一个数独问题的求解。
#include<stdio.h>
#include<string.h>
#define MAX 10
int visitr[MAX][MAX],visitc[MAX][MAX],visitg[MAX][MAX];
int map[MAX][MAX],store[MAX*MAX];
char str[MAX],s[MAX]="---";
int dfs(int cur,int cot){
int i,j,k;
if(cur==cot)
return 1;
else{
i=store[cur]/9,j=store[cur]%9;
for(k=1;k<=9;k++){
if(visitr[i][k]==0&&visitc[j][k]==0&&visitg[(i/3)*3+j/3][k]==0){
visitr[i][k]=1, visitc[j][k]=1, visitg[(i/3)*3+j/3][k]=1;
map[i][j]=k;
if(dfs(cur+1,cot)==1)
return 1;
else{
visitr[i][k]=0, visitc[j][k]=0, visitg[(i/3*3)+j/3][k]=0;
}
}
}
return 0;
}
}
int main(){
int t,l;
scanf("%d",&t);
getchar();
for(l=0;l<t;l++){
memset(visitr,0,sizeof(visitr));
memset(visitc,0,sizeof(visitc));
memset(visitg,0,sizeof(visitg));
int i,j,cot=0;
if(l>0)
gets(s);
for(i=0;i<9;i++){
gets(str);
for(j=0;j<9;j++){
if(str[j]=='?'){
map[i][j]=-1;
store[cot]=i*9+j;
cot++;
}
else{
map[i][j]=str[j]-'0';
visitr[i][map[i][j]]=1;//visitr标记在第i行某个从1~9的数字已经存在
visitc[j][map[i][j]]=1;//visitc标记在第j列某个从1~9的数字已经存在
visitg[(i/3)*3+j/3][map[i][j]]=1;//visitc标记在第(i/3)*3+j/3个宫格中某个从1~9的数字已经存在
}
}
}
if(dfs(0,cot)!=0){
if(l!=t&&l!=0)
printf("%s\n",s);
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("%d",map[i][j]);
}
printf("\n");
}
}
else{
if(l!=t&&l!=0)
printf("%s\n",s);
printf("impossible\n");
}
}
return 0;
}