zoukankan      html  css  js  c++  java
  • 剑指OFFER_矩阵中的路径

    剑指OFFER_矩阵中的路径

    题目描述

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 $egin{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语言的字符串结尾是'',所以代码中判断是否是最后一个字符的依据是下一个字符是否是'',就表示是否搜索到底了,差不多就是这样,代码如下:

    代码

    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 ('' == *(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;
        }
    
    
    };
    
  • 相关阅读:
    C++中的空类,编译器默认可以产生哪些成员函数
    野指针(Wild pointer)和悬垂指针(dangling pointer)
    WHY C++ ?(by Herb Sutter) & C++17 standard
    mapreduce 多路输出
    stdout 编码 vim 删除左边,右边
    积累碎片shell
    python logging模块
    shell 流程控制
    shell 变量
    时间管理法则
  • 原文地址:https://www.cnblogs.com/sakurapiggy/p/13193593.html
Copyright © 2011-2022 走看看