首页 > IT职业 > IT生活 > 用代码证明自己闲的蛋疼(三)——回溯法做数独
数独大家应该都玩过,1~9数字,满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。
起始会有一些给定的值,然后我们去填剩余的数,一个合理的数独最终解一定是唯一的。
九日哥也很喜欢玩数独,喜欢到最后都懒得算了,直接写个程序搜出答案。。。

解决思路是回溯,如果对回溯不了解的同学可以移步 http://blog.csdn.net/sm9sun/article/details/53244484
其实想一想,数独的规则是不是跟N皇后很相似??
我们假设一个9X9的二维数组a[9][9],如何判断值k是否可以插入某个点a[i][j]呢?
①该数组所有横向没有存在过k值
for(n=0;n if(a[i][n]==k)return 0;
②该数组纵向没有存在过k值
for(m=0;m if(a[m][j]==k)return 0;
③该点位于的九宫格3X3区间没有存在过k值
xm=(i/3)*3,xn=(j/3)*3;
for(m=xm;m
再来看看搜索的过程,9X9总共81个格子,我们以一个数字n作为标记i,j坐标点的变量(i=n/9; j=n%9;)
即:80就相当于最后一个格子 8/9=8,8%9=8(数组以0开始)
如果n等于80,那么就表示我已经遍历到最后一个点了,如果满足条件的话我们就找到最终解了。
如果n不等于80,表示我们还要继续往下试,即用不同的k值试探当前i,j点是否可以放下
回归后回溯即可~
void SD(int a[9][9],int n)//求解{int i,j;int b[9][9];for(i=0;i
完整代码如下:
#includeint count=0;void print(int a[9][9]){count++;printf("case: %d:n",count);for(int i=0;i
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/225/viewspace-2810741/ ,如需转载,请注明出处,否则将追究法律责任。