//把‘?’提取出来,搜索时检查,这是很暴力的方法,小菜仅会如此;听说还有更高的做法,以后研究了。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#define N 11
#define M 210
using namespace std;
int n,m,t,sumf;
int map[N][N];
char str[2];
struct TNode
{
int x,y;
}pt[M];
void scan()
{
int i=1;
while(i<81)
{
scanf("%s",str);
if(str[0]=='?') map[i/9][i%9]=0,pt[m].x=i/9,pt[m++].y=i%9;
else map[i/9][i%9]=str[0]-'0';
i++;
}
}
bool isok(int x,int y,int id)
{
int i,j,k,l;
for(i=0;i<9;i++)
{
if(map[x][i]==id||map[i][y]==id) return 1;
}
j=x/3*3,k=y/3*3;
for(i=0;i<3;i++) for(l=0;l<3;l++)
{
if(map[j+i][l+k]==id) return 1;
}
return 0;
}
bool dfs(int id)
{
int i,j,k,x,y;
if(id==m)
{
for(i=0;i<9;i++)
{for(j=0;j<9;j++)
{
if(j) printf(" ");
printf("%d",map[i][j]);
}
puts("");
}
return 1;
}
for(i=1;i<10;i++)
{
if(isok(pt[id].x,pt[id].y,i)) continue;
map[pt[id].x][pt[id].y]=i;
if(dfs(id+1)) return 1;
map[pt[id].x][pt[id].y]=0;
}
return 0;
}
int main()
{
int cases=0;
while(scanf("%s",str)!=EOF)
{
m=0;
if(str[0]=='?') map[0][0]=0,pt[m].x=0,pt[m++].y=0;
else map[0][0]=str[0]-'0';
scan();
if(cases++) puts("");
dfs(0);
}
return 0;
}
hdu1426---DFS
最新推荐文章于 2021-03-28 21:19:39 发布