求数独的编程思想

来源:百度知道 编辑:UC知道 时间:2024/05/07 01:52:39
如题:小弟正在学习c# ,想做个数独,只求编程思想
数独游戏规则

- 数独游戏在9x9的方格内进行,分为3x3的小方格,被称为“区”:



- 数独游戏首先从已经填入数字的格子开始:

- 数独游戏的目的是根据下列规则,用1至9之间的数字填满空格,一个格子只能填入一个数字:

1. 每个数字在每一行只能出现一次:

2. 每个数字在每一列只能出现一次:

3. 每个数字在每一区只能出现一次:

- 总结这些规则, 即每个数字在每一行、每一列和每一区只能出现一

我用EXCEL的宏编过,但是算法不太好,简单得可以作出,难得的就不行了
想法如下:
建立一个X(a,b,c,d)的列阵,4个数为(1,2,3)中的一个
a,b表示大的33阵(就是你所说的"区")的位置
c,d表示在特定33阵(特定"区")中的位置
那么每个特定的X表示特定的空格位置
每个X初始都=123456789
X的值表示这个空格可能取的数
然后已经给出的条件的X改为条件给出的数

现在我虽然不知道剩下的空格是哪个数,但是我可以知道特定的空格中不可以是哪个数(按规则)
step1
所以分别检查每个空格
将不可能出现的数字从123456789中删去(比如这个区已经存在1,4,5那么我们把区中其他的空格的1,4,5去掉,变成2,3,6,7,8,9)
这样X的位数就越来越小了
当X的长度等于1的时候那么这个空格就是唯一的了
step2
检查每一个区中的9个数中含有几个1,如果只有1个,那么含有1的哪个空格就是1了,(1-9,依次检验),(行或者列也要分别检验)
step3
检查是不是每个数都小于10,如果不是
检查经过step1和step2后,各个数字有没有变化,如果有,那么重复step1,step2.没有的话(说明按刚刚的步骤只能解到这样了)结束循环

我编的只是为了方便帮我解题,太难的做不出,但是用的话可以解出很多数了,人在看一下,很快就解出了

如果一定要编到底的话,我也想过
然后在X中寻找1个2位数,假定2位数中的一个是正确的,然后在按刚刚的步骤,如果结果有矛盾则就是另一个数
希望对你有帮助

太复杂了