点击打开链接http://acm.nyist.net/JudgeOnline/problem.php?pid=722
<pre name="code" class="cpp">#include <stdio.h>
#define M 10
int g[M][M],flag;
int check(int x,int y,int num)
{
int i,j,a,b;
a=(x/3)*3; //算出所处9宫格的第一个位置
b=(y/3)*3;
for(i=a;i<a+3;i++)
{
for(j=b;j<b+3;j++)
{
if(g[i][j]==num)
{
return 0;
}
}
}
for(i=0;i<9;i++)
{
if(num==g[i][y])
return 0;
}
for(j=0;j<9;j++)
{
if(num==g[x][j])
return 0;
}
return 1;
}
void dfs(int cur)
{
if(flag)
return;
int i,j,k,x,y;
if(cur==81) //全填完了
{
flag=1;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d ",g[i][j]);
}
printf("\n");
}
return;
}
x=cur/9; //算出 x,y坐标
y=cur%9;
if(g[x][y]) //已经填好了
{
dfs(cur+1);
}
else
{
for(i=1;i<=9;i++) //不为0 尝试9种可能
{
if(check(x,y,i))
{
g[x][y]=i;
dfs(cur+1);
g[x][y]=0; //回溯搜索
}
}
}
}
int main()
{
int t,i,j,k,n;
scanf("%d",&t);
while(t--)
{
flag=0;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
scanf("%d",&g[i][j]);
}
}
dfs(0);
}
return 0;
}