程序求解数独的简略思路
第一种:
1.读取方格,检测是否已存在数字,循环81(方格的总数)次。记录下空格的数量N和位置(xi,yi)(i=1~N);
2.每个空格(xi,yi)的备选数字为0-9,一共10种可能。N个空格,存在10^N种数字组合,即10^N种填法;
3.填入一种组合,检验是否合适。是,则完成;否,则填入下一种组合,循环直到满足要求。
这种方法思路比较简单,但可能会比较慢。
第二种:
1.读取方格,检验是否已存在数字。记录下已存在的数字c(c=0~9)与位置(xi,yi)。循环完毕,记录下空格的数量N,则已存在的数字总数为81-N;
2.已存在数字ci所在行、列、九宫格的空格可填入的数字为非c。记每个空格所在的行、列已有的c的数量为m,则每个空格可填入的选择有(10-m)种。总体一共有(10-m)^N种填法;
3.填入一种组合,检验是否合适。是,则完成;否,则填入下一种组合,循环直到满足要求。
这种思路稍微复杂一点,逻辑和人填数独的思路相近。由于(10-m)小于10,似乎应该会更快一点,但是可能也不一定。也许可以计算一下m,看在什么范围下第一种方法比较快,什么范围下第二种方法比较快,什么情况下两者一样。
在知网搜索了一下“数独”,在arXiv搜索了一下“sudoku”,发现已有的相关研究还挺多的。
(2019年4月29日) 翻了一下《Python科学计算》,发现682页给出了一个程序求解数独的实例。
无关的话:因为打算卖掉这本书而翻了一下,却有意外收获,也算很意外了吧……