数独解法小探:从回溯到约束编程
创作时间:
作者:
@小白创作中心
数独解法小探:从回溯到约束编程
引用
CSDN
1.
https://blog.csdn.net/zdy0_2004/article/details/51760947
数独是一种经典的逻辑游戏,要求在一个9x9的网格中填入1~9的数字,使得每一行、每一列以及九个3x3的子区域内都没有重复的数字。如何用程序的方法来解这个问题呢?本文将详细介绍五种不同的数独解法,包括回溯法、排列组合法、精确覆盖问题法、模拟退火法以及约束编程法。
回溯法
回溯法是一种经典的递归算法,通过尝试所有可能的解来寻找正确的答案。具体步骤如下:
- 依次扫描每一个待填数字的空格。
- 在第一个空格里面填上“1”,检查这个数字是否合法(其所在的行、列,以及3x3的子区域里不存在重复的数字)。如果合法,则前进到第二个格子。否则,在这个格子里继续试2,3,… ,直到合法为止。
- 在第二个格子里面继续填数字,从“1”开始试起,直到找到一个合法的数字,继续进到下一格。
- 如果在某个格子里,从“1”到“9”都不合法,这说明前面某个格子填错了。这时就回退到上一格,从还没试的数字里面继续试。例如,如果上一格已填的数字是3,就继续试4,5,6,… 是否合法。如果找到一个合法的数字,则又前进到下一格。如果找不到,说明前面还有格子也填错了,则继续回退到更前面一格,… 如此反复。
- 如果这个数独是有解的,我们总会遇到“每个格子都碰巧填对了”的情况。如果这个数独是没有解的,那么我们会遇到“第一个格子试了1~9所有的数字都不行”的情况。
排列组合法
排列组合法的核心思想是减少需要验证的解的数量。具体步骤如下:
- 对于每一空格子,考虑其所在行、列以及子区域,找出所有可能取值的列表S1
- 对每一个3x3的子区域,对其包含的所有空格子的取值S1进行排列组合,找出该子区域的所有解的列表S2.
- 9个3x3的子区域排成了三行。对每一行,对其包含的三个子区域的解S2排列组合,找出这一行的解的列表S3.
- 对三行的解S3排列组合,找出整张数独表的解。
精确覆盖问题法
将数独问题抽象为精确覆盖问题,再用解精确覆盖问题的算法如舞蹈链算法去解它。具体而言,我们是将解数独的问题转化为求一个“Exact Hitting Set”的问题。
模拟退火法
将数独问题表达为一个优化问题,再用求解优化问题的算法去解。核心是定义一个评价函数:将数独表里待填的数字当作自变量,将当前整个表格与有效解局面的区别程度当作函数值,数独问题即转化为一个优化问题:当数独表里填哪些数字时,评价函数的值最小?
约束编程法
将数独看成是一个约束求解问题,然后用约束编程的方法去解。这其实是一个很自然的理解方式:把数独表里的每一个空格看成一个变量,这些变量的可取值范围是1~9之间的整数。“每行、每列及每个3x3子区域内的变量均各不相等”就是这些变量要满足的约束。
总结
小小一个数独,竟可以从这么多的角度来看待和分析,不由得让人感叹思维之奇,数字之妙啊!
本文原文来自CSDN博客
热门推荐
木渎古镇申遗进行时:文化传承在路上
探访木渎古镇:明清建筑的魅力
乾隆六游木渎古镇,到底有何魅力?
《红楼梦》:人性可塑性的权威解读
苏东坡教你挑选红烧肉的优质猪肉
体检血常规血红蛋白偏低怎么回事
智能电梯如何应对突发断电?揭秘其核心技术与应用
恒安大厦:电梯断电时如何保障乘客安全?
商标注销后如何调整企业运营?
商标注销背后的品牌危机:从京东广场案例看企业应对之道
商标注销后如何自救?法律救济与品牌重建双管齐下
恒大债务危机加剧,楼市泡沫风险再升级
养羊驱虫有哪些方法?需要注意哪些?
养殖必看:育肥羊精饲料科学配比与注意事项
三款热门牛肉菜谱,让你秒变大厨!
春雨过后,竹笋为何一夜长高?
从自然到文化:张耒笔下的“雨后春笋”
仪征市东岳庙:千年古刹成网红打卡圣地
“福鹿雪国号”带你畅游漠河冰雪世界
从猪八戒看古今婚恋观之变:个人幸福与家族利益的博弈
“江南活八戒”姚百青:35年演绎一个经典角色
漏电保护器与电线匹配的重要性及实现方法
脑梗恢复期的三个阶段,患者应该注意哪些事项?
协和医生:运动真的可以预防脑卒中吗?
如何把握股票期权买卖的时机与技巧?这种时机和技巧如何在市场中灵活运用?
血常规的奥秘:每个指标背后的健康信号
六年级生教你如何深化友情
北师大版教你六年级友情维护秘籍
探秘太行山:河南北部的自然奇观之旅
时尚穿搭全攻略:掌握颜色搭配与质感选择的技巧