Sudoku(DFS)
#include<stdio.h>
#include <cstring>
int map[10][10],row[10][10],col[10][10],grid[10][10];
int DFS(int x,int y)
{
if(x==9)
return 1;
if(map[x][y])
{
if(y==8)
return DFS(x+1,0);
else
return DFS(x,y+1);
}
else
{
int k=x/3*3+y/3,flag=0;
for(int i=1;i<=9;i++)
if(!row[x][i] && !col[y][i] && !grid[k][i])
{
map[x][y]=i;
row[x][i]=col[y][i]=grid[k][i]=1;
if(y==8)
flag=DFS(x+1,0);
else
flag=DFS(x,y+1);
if(!flag) //不成功,回溯
{
map[x][y]=0;
row[x][i]=col[y][i]=grid[k][i]=0;
}
else
return 1;
}
}
return 0;
}
int main()
{
int i,j,test,k,m;
scanf("%d",&test);
while(test--)
{
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
memset(grid,0,sizeof(grid));
char MAP[10][10];
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
scanf("%1d",&map[i][j]); //这里是输入一位
if(map[i][j])
{
m=map[i][j];
k=i/3*3+j/3;
row[i][m]=col[j][m]=grid[k][m]=1;
}
}
DFS(0,0);
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%d",map[i][j]);
printf("\n");
}
}
return 0;
}