数独是十分流行的智力游戏 但用深搜(DFS),可以轻松解决这个问题。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[9][9],vis[10][10],a[10][10],b[10][10];
int count_num,flag; //count表示0的个数
struct node
{
int x;
int y;
}num[82];
void dfs(int k)
{
if(k==count_num) //填满输出
{
printf("\n");
flag=1;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
printf("%d ",map[i][j]);
printf("\n");
}
printf("\n");
return;
}
for(int i=1;i<10;i++) //从1-9选一个数填
{
///vis[i/3*3+j/3][map[i][j]]=1;
if(!vis[num[k].x/3*3 + num[k].y/3][i] && !a[num[k].x][i] && !b[i][num[k].y]) //判断每个九宫格里有没有这个数 //行列都没有这个数
{
map[num[k].x][num[k].y]=i; //填上这个数
vis[num[k].x/3*3+num[k].y/3][i]=1;////////
a[num[k].x][i]=1;
b[i][num[k].y]=1;
dfs(k+1);
//if(flag) //已完成任务 返回
//return;
map[num[k].x][num[k].y]=0;//不符合 去了这个数
vis[num[k].x/3*3+num[k].y/3][i]=0;/////归零
a[num[k].x][i]=0; //归零
b[i][num[k].y]=0;
}
}
return;
}
int main()
{
int k=1;
while(k)
{
flag=0;
cout<<"请输入数独形式:\n";
memset(vis,0,sizeof(vis)); //二维清空数组
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
count_num=0;
flag=0;
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j])
{
vis[i/3*3+j/3][map[i][j]]=1; //其所在的九宫格里有这个数
a[i][map[i][j]]=1; //该行有这个数
b[map[i][j]][j]=1; //该列有这个数
}
else
{
num[count_num].x=i;
num[count_num++].y=j; //记下空格坐标
}
}
cout<<"答案为:\n";
dfs(0);
if(!flag) cout<<"无答案!"<<endl;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。