剑指OFFER_矩阵中的路径

剑指OFFER_矩阵中的路径

题目描述

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

思路

牛客网给出的函数模板感觉怪怪的,明明是C++的编译器,用的面向对象,但是函数使用的C风格;

而且矩阵还是用的一维数组,需要手动转换成二维的,emmm,感觉怪怪的,下次还是刷LeetCode的剑指OFFER;

思路是这样的,使用一个递归函数从上下左右四个方向搜索,判断当前格子里面的字符是否和字符串的相等;

如果相等则继续向下搜索,然后字符串的指针+1,只有在搜索到最后一个字符的时候,如果依然相等,则返回真,这样DFS函数返回真的时候,表示字符串整体匹配;

C语言的字符串结尾是'\0',所以代码中判断是否是最后一个字符的依据是下一个字符是否是'\0',就表示是否搜索到底了,差不多就是这样,代码如下:

代码

class Solution {
public:
    int *vis;
    int row, col;
    bool dfs(int x, int y, const char *matrix, const char *str) {
        if (x<0 || x>=row || y<0 || y>=col) {
            return false;
        }
            
        int pos = x*col+y;
        if (vis[pos]) {
            return false;
        }
        if (*str != *(matrix+pos)) {
            return false;
        } else if ('\0' == *(str+1)) {
            return true;
        }
        
        vis[pos] = 1;
        if (dfs(x+1, y, matrix, str+1)){
            vis[pos] = 0;
            return true;
        }
        if (dfs(x-1, y, matrix, str+1)){
            vis[pos] = 0;
            return true;
        }
        if (dfs(x, y+1, matrix, str+1)){
            vis[pos] = 0;
            return true;
        }
        if (dfs(x, y-1, matrix, str+1)){
            vis[pos] = 0;
            return true;
        }
        vis[pos] = 0;
        return false;
        
    }
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        row = rows; col = cols;
        vis = new int[rows*cols];
        memset(vis, 0, rows*cols*sizeof(int));
        for (int i=0; i<rows; i++) {
            for (int j=0; j<cols; j++) {
                if (dfs(i, j, matrix, str)) {
                    return true;
                }
            }
        }
        return false;
    }


};
posted @ 2020-06-26 00:27  樱花小猪  阅读(85)  评论(0编辑  收藏  举报