这题是个DFS搜索题。
大致题意:
九宫格问题,也有人叫数独问题
把一个9行9列的网格,再细分为9个3*3的子网格,要求每行、每列、每个子网格内都只能使用一次1~9中的一个数字,即每行、每列、每个子网格内都不允许出现相同的数字。
#include <stdio.h>
#include <string.h>
bool vish[9][10],visl[9][10],visg[9][10];\\行标记数组,列标记数组,方块标记数组
int map1[9][9],flat;
void DFS (int x,int y)
{
int x1,y1,i;
if(flat==1)
{
return;
}
if(map1[x][y]==0)
{
for(i=1; i<10; i++)
{
if(!vish[x][i]&&!visl[y][i]&&!visg[x/3*3+y/3][i])
{
map1[x][y]=i;
y1=y+1;
x1=x;
if(y1==9)
{
y1=0;
x1++;
}
if(x1==9)
{
flat=1;
return ;
}
vish[x][i]=1;
visl[y][i]=1;
visg[x/3*3+y/3][i]=1;
DFS(x1,y1);
if(flat)
{
return;
}
vish[x][i]=0;
visl[y][i]=0;
visg[x/3*3+y/3][i]=0;
map1[x][y]=0;
}
}
}
else
{
y1=y+1;
x1=x;
if(y1==9)
{
y1=0;
x1++;
}
if(x1==9)
{
flat=1;
return ;
}
DFS(x1,y1);
}
return ;
}
int main()
{
int t,i,j,m;
scanf("%d",&t);
char s[12];
while(t--)
{
memset(vish,0,sizeof(vish));
memset(visl,0,sizeof(visl));
memset(visg,0,sizeof(visg));
for(i=0; i<9; i++)
{
scanf("%s",s);
for(j=0; j<9; j++)
{
m=s[j]-'0';
if(m)
{
vish[i][m]=1;
visl[j][m]=1;
visg[i/3*3+j/3][m]=1;
map1[i][j]=m;
}
else
{
map1[i][j]=0;
}
}
}
flat=0;
DFS(0,0);
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",map1[i][j]);
}
printf("\n");
}
}
return 0;
}