牛客网剑指offer-矩阵中的路径

题目描述

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


class Solution {
public:
    //DFS,枚举起点
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        if (matrix == nullptr || str == nullptr || str[0] == '\0' || rows <= 0 || cols <= 0)
            return false;
        bool* vis = new bool[rows*cols];
        for (int i = 0; i < rows*cols; ++i)
            vis[i] = false;
        for (int i = 0; i < rows*cols; ++i)
            if(dfs(matrix, vis, rows, cols, i, str))
            {
                delete vis;
                return true;
            }
        return false;
    }
private:
    int dir[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};
    bool dfs(char* matrix, bool* vis, int rows, int cols, int now, char* str)
    {
        int r = now/cols, c = now%cols;
        if (now < 0 || now >= rows*cols || vis[now] || matrix[now] != *str)
            return false;
        if (*(str+1) == '\0')
            return true;
        vis[now] = true;
        for (int i = 0; i < 4; ++i)
        {
            if (dfs(matrix, vis, rows, cols, (r+dir[i][0])*cols + (c+dir[i][1]), str+1))
                return true;
        }
        vis[now] = false;
        return false;
    }
};


你可能感兴趣的:(剑指offer)