深搜玩转数独

数独是十分流行的智力游戏 但用深搜(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;
}








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值