简单题意
数独游戏,给出个数独,填充完整数独
解题思路形成过程
和老师上课讲的例题差不多,不过这个题使用?来代替未填数的位置,只要改一下就好了。记录所有?位置,判断当前空位置是否可以填某个数,然后直接DFS。
感想
做了好几遍才输出正确结果。。累。
AC代码
#include<iostream>
#include<fstream>
using namespace std;
struct point{
int x,y;
}pur[100];
int map[10][10],flag,num;
int check(int k,int cur){
int i,j,x,y;
for(i=0;i<9;i++)
if(map[pur[cur].x][i]==k||map[i][pur[cur].y]==k)return 0;
x=(pur[cur].x/3)*3;
y=(pur[cur].y/3)*3;
for(i=x;i<x+3;i++)
for(j=y;j<y+3;j++)
if(map[i][j]==k)return 0;
return 1;
}
void DFS(int step){
int i,j;
if(step==num){
for(i=0;i<9;i++){
for(j=0;j<8;j++)
printf("%d ",map[i][j]);
printf("%d\n",map[i][8]);
}
flag=1;
return;
}else{
for(i=1;i<=9;i++){
if(check(i,step)&&!flag){
map[pur[step].x][pur[step].y]=i;
DFS(step+1);
map[pur[step].x][pur[step].y]=0;
}
}
}
return;
}
int main(){
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
int i,j,cas=0;
char s[3];
while(scanf("%s",s)!=EOF){
num=0;
if(s[0]=='?'){pur[num].x=0;pur[num].y=0;num++;map[0][0]=0;}
else map[0][0]=s[0]-'0';
for(i=0;i<9;i++)
for(j=0;j<9;j++){
if(i==0&&j==0)continue;
scanf("%s",s);
if(s[0]=='?'){pur[num].x=i;pur[num].y=j;num++;map[i][j]=0;}
else map[i][j]=s[0]-'0';
}
flag=0;
if(cas++)printf("\n");
DFS(0);
}
return 0;
}