剑指 Offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径

考察回溯法
在这里插入图片描述

回溯其实就是纯暴力枚举,把所有情况列举下,如果列举到一半发现已经不符合要求了及时剪枝,并且把之前做出的选择撤销,比如本题如果列举的一条路径不符合要求,把之前访问过的位置全部改回原来的值。也就是先试着走着,不对就撤回去,再重走(枚举的搜索尝试过程)。
第一步:先在二维数组中找到字符串的第一个字符
第二步:找到后将该位置置为’-’,防止重复访问
第三步:向该位置的周围遍历,看哪个符合下个字符的内容
第四步:若符合继续找下去,否则还原置为’-'的元素,返回去重找
代码为:

var exist = function(board, word) {
    var row = board.length;
    var col = board[0].length;

    var dfs = function(i,j,board,word,index){
        if(i < 0 || i >= row || j < 0 || j > col || board[i][j] !== word[index]) return false; // 判断不符合条件
        if(index === word.length - 1) return true;  // word遍历完了
        var tmp = board[i][j];  // 记录到board的值
        board[i][j] = '-'      // 锁上,因为后续的递归是4个方向上的,无法保证上一个方向的值
        var res =  dfs(i - 1,j,board,word,index + 1) || dfs(i + 1,j,board,word,index + 1) || dfs(i,j - 1,board,word,index + 1) || dfs(i,j + 1,board,word,index + 1);
        board[i][j] = tmp;   // 恢复现场,这里是回溯法的核心所在,剪枝
        return res;
        
    }

    // 遍历整个board,找到初始位置点
    for(var i = 0;i < row; i++){
        for(var j = 0; j < col; j++){
            if(dfs(i,j,board,word,0)) return true;
        }
    }
    // 没找到
    return false
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值