数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。
#include<stdio.h>
#define n 9
int a[n][n]={
0, 0, 5, 3, 0, 0, 0, 0, 0,
8, 0, 0, 0, 0, 0, 0, 2, 0,
0, 7, 0, 0, 1, 0, 5, 0, 0,
4, 0, 0, 0, 0, 5, 3, 0, 0,
0, 1, 0, 0, 7, 0, 0, 0, 6,
0, 0, 3, 2, 0, 0, 0, 8, 0,
0, 6, 0, 5, 0, 0, 0, 0, 9,
0, 0, 4, 0, 0, 0, 0, 3, 0,
0, 0, 0, 0, 0, 9, 7, 0, 0
};
//判断大九宫格和小九宫格中有没有不符合条件的
bool ok(int x,int y)
{
//根据行和列以此判断大九宫格中有没有不符合条件的
int i,j;
for(i=0; i<n; i++)
if(i!=x && a[i][y]!=0 && a[i][y]==a[x][y])
return false;
for(j=0; j<n; j++)
if(j!=y && a[x][j]!=0 && a[x][j]==a[x][y])
return false;
//根据大九宫格的坐标求出每个小九宫格中数的坐标
int x1=x/3*3;
int y1=y/3*3;
//判断九个小九宫格中有没有不符合条件的
for(i=x1; i<x1+3; i++)
for(j=y1; j<y1+3; j++)
if(i!=x && j!=y && a[i][j]!=0 && a[i][j]==a[x][y])
return false;
return true;
}
//进行回溯
void traceback(int t)
{
if(t==n*n) //当t走到最后一层时,输出数组
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
printf("%d ",a[i][j]);
putchar('\n');
}
}
else
{
//求出t时的坐标
int x=t/9;
int y=t%9;
if(a[x][y]==0) //当a[x][y]没有数时,给a[x][y]进行赋值
{
for(int i=1; i<=n; i++)
{
a[x][y]=i;
if(ok(x,y)) //如果赋的值符合条件,判断下一层
traceback(t+1);
a[x][y]=0;
}
}
else //当a[x][y]有数时,直接判断下一层
traceback(t+1);
}
}
int main()
{
traceback(0);
return 0;
}