你遇到不会做的数独怎么办?会编程就是不一样~~~
暂时没找到可提交的地方,往后会加:
输入样例:
0 0 4 0 0 0 0 3 0
0 6 3 0 0 0 0 0 2
8 9 0 1 0 0 0 0 0
0 0 8 0 7 2 0 0 0
0 0 0 8 4 6 0 0 0
0 0 0 9 3 0 5 0 0
0 0 0 0 0 5 0 1 6
1 0 0 0 0 0 8 5 0
0 5 0 0 0 0 3 0 0
输出样例:
2 1 4 6 8 7 9 3 5
7 6 3 4 5 9 1 8 2
8 9 5 1 2 3 7 6 4
9 3 8 5 7 2 6 4 1
5 7 1 8 4 6 2 9 3
6 4 2 9 3 1 5 7 8
3 8 7 2 9 5 4 1 6
1 2 9 3 6 4 8 5 7
4 5 6 7 1 8 3 2 9
上代码:
//数独:9*9
#include<cstdio>
#include<cstring>
int a[11][11],ans=0;
bool h[20][10],l[20][10],g[20][10];
int ch(int x,int y)//求(x,y)所在的宫
{
return 3*((x-1)/3)+(y-1)/3;
}
void dfs(int x,int y)
{
if(x>9)//做出来一种解
{
ans++;
printf("%d:\n",ans);//输出当前的解
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return ;
}
if(y>9) { dfs(x+1,1);return ; } //填完一行去下一行
if(a[x][y]>0) { dfs(x,y+1);return ; }//原来格子有数字,不用填
for(int i=1;i<=9;i++)
{
int k=ch(x,y);//查找当前坐标所在的宫
if(h[x][i]&&l[y][i]&&g[k][i])//行、列、宫都没有重复的
{
h[x][i]=l[y][i]=g[k][i]=0;
a[x][y]=i;
dfs(x,y+1);
a[x][y]=0;//回溯还原
h[x][i]=l[y][i]=g[k][i]=1;
}
}
}
int main()
{
//freopen("ss.out","w",stdout);
memset(h,true,sizeof(h));//行 初始化
memset(l,true,sizeof(l));//列 初始化
memset(g,true,sizeof(g));//宫 初始化
int t;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
scanf("%d",&t);
int k=ch(i,j);//找宫
h[i][t]=l[j][t]=g[k][t]=0;//封路
a[i][j]=t;
}
}
dfs(1,1); //从第一行第一列开始搜
printf("%d",ans);
return 0;
}