数独的生成与破解算法分析
     首先在此向大家道歉,我在上一篇博文中转载了一篇关于数独的生成与破解算法的文章,其中作者的破解算法确实不错,也没有问题,但是其生产算法是有问题的。虽然初看起来每行每列都符合要求,但是是无解的。例如,我用其破解算法解由它生成算法生成的数独,结果没有解法出来。
最近在网上看到不少人发帖,生成数独的算法如下:
1 随机生成一个1-9的整数;
2:随机生成一个坐标位置
3:判断这个整数放在这个坐标位置处是否符合条件,也就是行,列,九宫格不重复
4:满足条件就赋值,否则转到步骤1
这种算法初看没有错,但是通常都是无解的。所以实际上生成一个有解的数独并不容易,许多人的构想是先用破解算法生成一个完整的数独,然后根据难易程度挖去n个数字,于是就得到了符合条件的数独。
这种做法是可行的,我也是这样做的,但是先用破解算法生成一个完整的破解数独的前提是必须有一个有解的数独。 我曾经看到有人先在第一行随机填满1-9,然后在用破解算法破解,但是这样的话递归深度太大,有72个不确定度为8的位置,计算机容易失去响应甚至陷入死循环,我开始时也是这样做的,发现不行。
这样减少了9个深度在破解,发现成功的概率还是只有50%左右,仍然还是会有近一半的可能陷入死循环的递归中,所以还是需要进一步减少深度。
最近在网上看到不少人发帖,生成数独的算法如下:
1 随机生成一个1-9的整数;
2:随机生成一个坐标位置
3:判断这个整数放在这个坐标位置处是否符合条件,也就是行,列,九宫格不重复
4:满足条件就赋值,否则转到步骤1
这种算法初看没有错,但是通常都是无解的。所以实际上生成一个有解的数独并不容易,许多人的构想是先用破解算法生成一个完整的数独,然后根据难易程度挖去n个数字,于是就得到了符合条件的数独。
这种做法是可行的,我也是这样做的,但是先用破解算法生成一个完整的破解数独的前提是必须有一个有解的数独。 我曾经看到有人先在第一行随机填满1-9,然后在用破解算法破解,但是这样的话递归深度太大,有72个不确定度为8的位置,计算机容易失去响应甚至陷入死循环,我开始时也是这样做的,发现不行。
为了解决这个问题,有两个优化方法,第一:另开一个线程,防止主线程失去响应;其次就是减少递归的深度,也就是在9×9的格子里面多天几个数字。我做的时候是在第一行和第九行分别填满1-9,且保证上下不重复, 这样就减少了9个深度,不确定度也减少到7了。
这样减少了9个深度在破解,发现成功的概率还是只有50%左右,仍然还是会有近一半的可能陷入死循环的递归中,所以还是需要进一步减少深度。
在此期间,我发现如果计算机能够解出数独,时间是几百毫秒的,如果解不出,估计电脑烧起来了也动不了,所以这时候可以选择折中的办法,减少深度,增大重复计算的次数。 也就是说在已经填好的9*9格子中随机填入少量的随机数,虽然不一定有解,但是只要填入的随机数不是太多,有解的概率还是挺大的。例如随机数数目n=6是,平均重复24次,但是计算机破解成功的概率是100%; 时间在2秒左右。
具体代码是:
其次,还可以把第一列的数字填满,这样不需要填入随机数就可以了,而且效率更高,我也是这样做的。
这样计算机就可以得到一个完整的数独了,虽然时间长了点,但是不会使递归失去响应,还是挺不错的。
接下来我还是把破解的算法写在下面的,具体的可以看我的上一篇博文,是转载的,确实不错的算法。
   如果大家有什么更好的想法,也麻烦大家赐教呀! 好好学习,天天进步。
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号