算法杂谈--构造数独
数独描述:在9*9的格子内,填入1~9,要求每一行每一列不能有重复数,并且,每个格子所处的3*3格子内不得有重复数。
分析:这是一个典型的递归回溯算法,本例中用一个except[9][9][9]的数组来构造每个格子的禁忌表(就是该格子中不能填入的数)。用变量hs来表示此次填数是向前递归运算还是回溯运算。如果是向前递归,则计算该格子的禁忌表,如果是回溯,则将当前格子中的数加入禁忌表。
#include
#include
#include
#include
#include
//用于标记是否回溯
int hs=0;
//记录每一个格子的禁忌数字,即当前格子不能填入的数字
int except[9][9][9];
//保存结果
int res[9][9];//随机获取一个值
int getRan()
{return rand()/(RAND_MAX+1.0)*9+1;
}//判断随机的值是否在禁忌表
int inforb(int jg,int *fibd)
{if(fibd[jg-1]==jg)return 1;return 0;
}//判断禁忌表是否已满,如果满则需要回溯
int is_full(int *fbid)
{int i;for(i=0;i<9;i++){if(fbid[i]==0)return 0;}return 1;
}//构造数独
void gouzao(int i,int j)
{if(j==9){i++;j=0;}//当到第10行的时候递归结束if(i==9
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
