构造数独
来源:互联网 发布:开淘宝店运费怎么办 编辑:程序博客网 时间:2024/04/29 11:00
程序功能是随机生成一个数独的解。我做这个其实是为在Android中写一个数独游戏,那么怎么来实现这个小程序呢?其实我在之前就有写过一个小程序是用来求解数独的,花了三个小时吧,现在看来真是老太太的裹脚布又臭又长。今天写的这个构造函数并不是来自书上(因为看别人的代码真的很头疼)。大体的思路其实就是,通过深度优先搜索和回溯来不断的尝试数独中的每一个位置,当一个位置中不能填入1-9中的任何一个数时,就回溯改变上一个位置的值,以此类推,当数独填满时,也就得到了我们要的解,但是有一个问题就是,假如我们每次每个位置都从1尝试到9,那么意味着每次都产生了相同的解,怎么办呢,我们可以这样,随机产生(1,2,3,4,5,6,7,8,9)这个数组的一种排列(具体看代码),这样我们就可以来每次尝试ai[0]-ai[8],就可以每次产生不同的解了
#include"iostream"#include"string.h" #include"time.h"#include"stdlib.h"#include"stdio.h"using namespace std;int ai[9][9];bool hang[9][10]; //第i行是否存在j bool lie[9][10]; //第i列是否存在j bool ge[9][10]; //第i个小宫格是否存在j bool IsOver;int m[9]={1,2,3,4,5,6,7,8,9};void dfs(int a,int b){ if(IsOver) return ; if(a==9&&b==0) { for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { cout<<ai[i][j]<<" "; } cout<<endl; } IsOver=true; return; } int qu=a/3*3+b/3+1; for(int i=0;i<9;i++) { if(!hang[a][m[i]]&&!lie[b][m[i]]&&!ge[qu][m[i]]) { ai[a][b]=m[i]; hang[a][m[i]]=true; lie[b][m[i]]=true; ge[qu][m[i]]=true; if(b==8) dfs(a+1,0); else dfs(a,b+1); hang[a][m[i]]=false; lie[b][m[i]]=false; ge[qu][m[i]]=false; } } return;}void make(){ memset(hang,false,sizeof(hang)); memset(lie,false,sizeof(lie)); memset(ge,false,sizeof(ge)); IsOver=false; for(int i=0;i<9;i++) //这一段的功能就是用来生成0-9随机的排列 { swap(m[i],m[rand()%9]); } dfs(0,0);}int main(){ srand((unsigned)time(NULL)); make(); return 0;}
阅读全文
0 0
- 构造数独
- 1.15 构造数独
- 构造数独
- 构造数独
- 构造数独
- 构造数独
- 构造数独和解数独
- 算法杂谈--构造数独
- 编程之美...构造数独
- 编程之美 1.15 构造数独
- 第一章 游戏之乐 构造数独
- 读书笔记之编程之美 - 1.15 构造数独
- 编程之美1.15——构造数独
- 编程之美——构造数独
- 编程之美中构造数独例子
- 编程之美1.15——构造数独
- [编程之美] PSet1.15 构造数独
- 编程之美:第一章 1.15构造数独
- 【bzoj1415】【聪聪和可可】期望dp(记忆化搜索)+最短路
- Java中创建对象的5种方式
- [LeetCode]435. Non-overlapping Intervals
- 1.2 什么是神经网络
- 重载运算符
- 构造数独
- jQuery知识总结
- python 碎碎念
- Javascript实现Ajax请求
- N皇后问题(递归和动态规划)
- hdoj 5976 Detachment
- 接口回调的主要的三步
- Python对象中的属性为什么可以临时增加
- SSL P2720 天平问题