数独解法小探:从回溯到约束编程
创作时间:
作者:
@小白创作中心
数独解法小探:从回溯到约束编程
引用
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博客
热门推荐
中医推荐:晚上喝牛奶,真的能助眠?
变压器油质怎么监测(变压器油的12种在线检测方法)
绝缘油专用滤油机日常维护的小秘诀
浅谈干式变压器的特点以及调试技术
情绪价值解码:为什么TA总能让你“上头”?
情绪增值:提升情绪资本的实用策略
0-1岁宝宝心理抚养全攻略:从安全感到情感依恋
1-5岁儿童心理发展关键期:如何科学育儿?
李玫瑾教授谈儿童教育:这些关键点父母要知道
碳原子的结构及轨道的杂化
碳原子几种杂化形式的对应结构是什么,举例说明
2024年北京高考志愿填报时间出炉!这些变化考生需留意
广东省2024年高考志愿填报时间安排及注意事项
高考志愿填报心理调适指南
创意艺术工坊:家庭情感升温的新方式
智能家居设备:甲醛检测神器上线啦!
广东财大甲醛超标,教你科学除醛
游戏昵称大作战:让你成为游戏世界里的“网红”
神经递质失衡与习得性无助症:从机制到治疗的新进展
马丁·塞利格曼推荐:习得性无助症的心理干预法
职场焦虑爆棚?教你告别“习得性无助”
元旦祝福攻略:从文字到视频,多种创意玩法让你秒变祝福达人
家庭游戏日:让亲子互动更有趣味
滕爱有家:赵亚汝教你互动式祝福
大型纪录片《中华战争通史》——论假道伐虢的策略智慧
“远交近攻”:从古至今的战略智慧
2025浙江高考成绩查询攻略:官方渠道汇总
高考成绩公布后,如何快速调整心态?
成都燃气教你安全使用唯尔柏丽燃气热水器
燃气热水器尺寸怎么选?家庭人数说了算!