参考代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[9][9]={
{8,0,0,0,0,0,0,0,0},
{0,0,3,6,0,0,0,0,0},
{0,7,0,0,9,0,2,0,0},
{0,5,0,0,0,7,0,0,0},
{0,0,0,0,4,5,7,0,0},
{0,0,0,1,0,0,0,3,0},
{0,0,1,0,0,0,0,6,8},
{0,0,8,5,0,0,0,1,0},
{0,9,0,0,0,0,4,0,0}
};
long count=0;
bool test(int x,int y)
{
int i,j;
int left,up;
for(i=0;i<9;i++)
{
if(i!=y&&a[x][y]==a[x][i])
return false;
if(i!=x&&a[x][y]==a[i][y])
return false;
}
left=y/3*3;
up=x/3*3;
for(i=up;i<up+3;i++)
for(j = left;j < left + 3;j++)
if(x!=i && y!=j && a[x][y]==a[i][j])
return false;
return true;
}
void backtrack(int x,int y)
{
int i,j;
if(x==9)
{
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%d\t",a[i][j]);
putchar('\n');
putchar('\n');
}
printf("OK!\n");
exit(1);
}
else
{
if(y==9)
{
x++;
y=0;
backtrack(x,y);
}
else
{
if(a[x][y]==0)
{
for(i=1;i<10;i++)
{
a[x][y]=i;
if(test(x,y))
{
backtrack(x,y+1);
}
}
a[x][y]=0;
}
else
backtrack(x,y+1);
}
}
}
int main()
{
/* int i,j;
printf("输入:\n");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
scanf("%d",&a[i][j]);
}
}*/
printf("结果:\n");
backtrack(0,0);
return 0;
}