码迷,mamicode.com
首页 > 其他好文 > 详细

深搜玩转数独

时间:2015-08-18 16:26:56      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:数据结构   深度优先搜索   

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

技术分享






版权声明:本文为博主原创文章,未经博主允许不得转载。

深搜玩转数独

标签:数据结构   深度优先搜索   

原文地址:http://blog.csdn.net/jobsandczj/article/details/47751841

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!