• 剑指Offer:矩阵中的路径


    剑指Offer:矩阵中的路径

    题目要求:
    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

    解题思路: 深度优先搜索

    1. 既然是在二维数组中,寻找与给定字符串的相同的路径,并且每次只能上下左右移动一格,且不能走重复的路;
    2. 应在数组中寻找给定字符串第一个字符,以确定路径的开始端,若找到进行清除标志,否则返回错误;
    3. 在进行上下左右移动时,其数组下标为:x+1,x-1,y+1,y-1;
    4. 进行找到第一个字符时,再按照上述方法进行第二次查找,进行递归查找。

    注意:

    1. 考虑数组越界问题;
    2. 在最后需要将二维数组进行还原;
    class Solution {
    public:
    bool exist(std::vector<std::vector<char>> &board, const std::string &word) {
        if (board.empty() || board.size() == 0 || board[0].size() == 0) {
            return false;
        }
    
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board[0].size(); j++) {
                if(board[i][j]==word[0]){
                    if (dfs(board, word, 0, i, j)) {
                        return true;
                    }
                }
            }
        }
    
        return false;
    }
    
    private:
    bool dfs(std::vector<std::vector<char>> &board, const std::string &word, int index, int x, int y) {
        //判断是否越界和是否继续递归
        if (x < 0 || x >= board.size() || y < 0 
            || y >= board[0].size() || board[x][y] != word[index]) {
            return false;
        }
        //递归结束
        if (index == word.size() - 1) {
            return true;
        }
        //直接改变矩阵中的值,防止重复搜索
        //比使用mark[][]数组存储访问标志要简单
        char tmp = board[x][y];
        board[x][y] = '.';			//每个查找过后将其赋值空,防止二次查找
    
        //递归查找,查询的四个方向:上下左右{(x+1,y),(x-1,y),(x,y+1),(x,y-1)}
        if (dfs(board, word, index + 1, x, y + 1)
            || dfs(board, word, index + 1, x, y - 1)
            || dfs(board, word, index + 1, x + 1, y)
            || dfs(board, word, index + 1, x - 1, y)) {
            return true;
        }
        //恢复为原值
        board[x][y] = tmp;			//注意 进递归 出递归 的值
    
        return false;
    }
    };
    
  • 相关阅读:
    MCMC算法解析
    深度学习结合SLAM研究总结
    语义SLAM研究现状总结
    Tensorflow--矩阵切片与连接
    faster-rcnn原理讲解
    Tensorflow 大规模数据集训练方法
    SPP-net原理解读
    Batch Normalization原理
    RCNN算法的tensorflow实现
    Tensorflow基本操作理解
  • 原文地址:https://www.cnblogs.com/Tavi/p/12514033.html
Copyright © 2020-2023  润新知