构造数独

来源:互联网 发布:开淘宝店运费怎么办 编辑:程序博客网 时间: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;}
原创粉丝点击