鄙人不才,不会其他算法。看到数独第一个想法就是递归来接。
数独的规则大家都知道:
一个9*9的81格矩阵;
同一列只能有1-9九个数字,不能重复;
同一行只能有1-9九个数字,不能重复;
在一个小的3*3矩阵中,只能有1-9九个数字,不能重复;

那么接数独的思路是这样的,在一个空格子中,先从同一列,同一行,小矩阵中排除已有的数字,然后在剩下的数字中先填一个,再到下一个空格子中重复此步骤,如果下一个格子中找不出解,那么说明在之前的步骤中填的数字是不对的,那就回退到之前的格子,换一个数字继续下一步。
用伪代码先梳理一下思路:
var solveSudoku = function(board){
//board是二维数组,来表示行和列
遍历board => v:
if(v === ".") continue; //空格用 . 表示
var number = ["1","2","3","4","5","6","7","8","9"];
遍历当前行:
如果有数字,从number中删除;
遍历当前列:
如果有数字,从number中删除;
遍历当前小矩阵:
如果有数字,从number中删除;
//此时number中如果有生育数字,那么就是可以填如的解,如果没有,则回退到上一部
if(number.length < 1) return -1;
遍历number => n:
//以此尝试可能的值
v = n;
//开始遍历,如果返回的值是-1,说明这个值是不正确的,需要还原
//还原是很重要的操作,因为函数参数是引用变量,不会自己回退到之前的状态
if(solveSudoku(board) === -1) v=".";
//如果没有返回-1,则是正确的答案,直接结束遍历number
else break;
结束遍历number
//如果遍历完number,当前的值依然是v==="."说明遍历完number也是没有正确答案,还是要返 回-1
if(v===".") return -1;
结束遍历board
}
本文介绍了一种使用递归算法解决数独问题的方法。通过逐个填充空格,并验证每一步是否符合数独规则,实现了对数独的有效求解。
448

被折叠的 条评论
为什么被折叠?



