剑指offer之矩阵中的最短路径

版权声明:所有的博客都是个人笔记,交流可以留言。未经允许,谢绝转载。。。 https://blog.csdn.net/qq_35976351/article/details/88638586

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

解题思路

一个经典的DFS解题算法。需要注意的是下标的转换,矩阵是一维的,但是为了方便计算,我们用了3个转换函数进行1-2维的转换计算。注意使用判重即可。需要注意只有一个字母的特殊边界条件。

AC代码

代码是可以通过的。但是还有一个疑问,dfs函数第一个行注释的情况,为什么去掉了就不能完全通过了,希望有dalao可以解释一下。

class Solution {
public:
    bool hasPath(const char* matrix, int rows, int cols, const char* str) {
        if (rows * cols <= 0 || matrix == nullptr) {
            return false;
        }
        if (str == nullptr || str[0] == '\0') {
            return true;
        }
        // 只有一个字母的特殊情况
        if (rows == cols && rows == 1 && str[0] == matrix[0] && str[1] == '\0') {
            return true;
        }
        R = rows;
        C = cols;
        memset(visited, 0, sizeof(visited));
        for (int i = 0; i < R * C; ++i) {
            if (dfs(matrix, Row(i), Col(i), str)) {
                return true;
            }
        }
        return false;
    }

private:
    bool dfs(const char* mat, int row, int col, const char* str) {
        if (*str == '\0'/* || mat[Pos(row, col)] == *str && *(str + 1) == '\0'*/) {
            return true;
        }
        if (mat[Pos(row, col)] != *str) {
            return false;
        }

        for (int i = 0; i < 4; ++i) {
            int r = row + offset[i][0];
            int c = col + offset[i][1];
            if (r < 0 || c < 0 || r >= R || c >= C || visited[r][c]) {
                continue;
            }
            visited[r][c] = true;
            if (dfs(mat, r, c, str + 1)) {
                return true;
            }
            visited[r][c] = false;
        }
        return false;
    }

    inline int Pos(int r, int c) { return r * C + c; }
    inline int Row(int n) {return n / C;}
    inline int Col(int n) { return n % C; }

    bool visited[1000][1000];
    int offset[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
    int R{ 0 }, C{ 0 };
};

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/88638586