剑指 Offer day13|12. 矩阵中的路径,13. 机器人的运动范围

剑指 Offer 12. 矩阵中的路径

题目描述:剑指 Offer 12. 矩阵中的路径
题解思路:面试题12. 矩阵中的路径( DFS + 剪枝 ,清晰图解)

class Solution {
public:
    int rows, cols, k;
    bool exist(vector<vector<char>>& board, string word) {
        rows = board.size();
        cols = board[0].size();
        k = 0;

        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                bool flag = bfs(board, word, i, j, k);
                if(flag)return true;
            }
        }
        return false;
    }

    bool bfs(vector<vector<char>>& board, string word, int i, int j, int k){
        if(i < 0 || i >= rows || j < 0 || j >= cols || board[i][j] != word[k])return false;
        if(k == word.size() - 1)return true;

        board[i][j] = '/0';

        bool res = (bfs(board, word, i + 1, j, k + 1) || bfs(board, word, i, j + 1, k + 1) 
            || bfs(board, word, i - 1, j, k + 1) ||bfs(board, word, i, j - 1, k + 1));
        
        board[i][j] = word[k];

        return res;
    }


};

面试题13. 机器人的运动范围

题目描述:面试题13. 机器人的运动范围
题解思路:剑指 Offer 13. 机器人的运动范围( 回溯算法,DFS / BFS ,清晰图解)

class Solution {
public:
    int mmax, nmax; //用来边界判断
    
    int movingCount(int m, int n, int k) {
        mmax = m;
        nmax = n;
        vector<vector<bool>> v(m, vector<bool>(n, 0)); //记录当前结点是否被访问过
        return dfs(v, 0, 0, k); //开始遍历
    }

    int dfs(vector<vector<bool>> &v, int i, int j, int k){
        if(i >= mmax || i < 0 || j >= nmax || j < 0 || v[i][j] || sum(i,j) > k)return 0; //不符合条件直接返回0
        v[i][j] = true; //将符合条件的位置标记
        return 1 + dfs(v, i + 1, j, k) + dfs(v, i, j + 1, k); //,符合条件的节点数加1,并对当前结点的右边下边结点进行遍历
    }

    int sum(int i, int j){ //计算两数各位数之和
        int sum = 0;
        while(i != 0){
            sum += i % 10;
            i /= 10;
        }
        while(j != 0){
            sum += j % 10;
            j /= 10;
        }
        return sum;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值