数独的递归解法

本文介绍了一种使用递归算法解决数独问题的方法。通过逐个填充空格,并验证每一步是否符合数独规则,实现了对数独的有效求解。

鄙人不才,不会其他算法。看到数独第一个想法就是递归来接。

数独的规则大家都知道:

一个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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值