题目中给出一个数独,要求你输出填完的方案。
直接DFS搜索,需要记录行、列以及9个格子的数使用状态(剪枝)
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char map[10][10];
int ans,row[10][10],col[10][10],box[10][10];
void DFS(int index)
{
if(index>=81)
{
ans=1;
return;
}
int x=index/9;
int y=index%9;
if(map[x][y]!='0')
{
DFS(index+1);
return;
}
for(int i=1;i<10;i++)
{
if(!row[x][i]&&!col[y][i]&&!box[x/3*3+y/3][i])
{
map[x][y]='0'+i;
row[x][i]=1;
col[y][i]=1;
box[x/3*3+y/3][i]=1;
DFS(index+1);
if(ans)
return;
map[x][y]='0';
row[x][i]=0;
col[y][i]=0;
box[x/3*3+y/3][i]=0;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ans=0;
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
memset(box,0,sizeof(box));
for(int i=0;i<9;i++)
scanf("%s",&map[i]);
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if(map[i][j]!='0')
{
row[i][map[i][j]-'0']=1;
col[j][map[i][j]-'0']=1;
box[i/3*3+j/3][map[i][j]-'0']=1;
}
DFS(0);
for(int i=0;i<9;i++)
printf("%s\n",map[i]);
}
return 0;
}