如题,牛客网上题目没有图示,下图是从原书中截图得到的。

《剑指offer》c++版本 12. 矩阵中的路径_剑指offer

本题就是从数组中按照指定方向查找字符序列,典型的回溯行为,找到当前字符,继续查找该字符上下左右四个方向,找不到,返回上一个字符,重新查找。题目要求,路径中不能访问同一个字符,可以创建一个等大小的bool二维数组,记录已访问的点,每次访问一个点,置标志位,注意。如果该点的后一个结点不符合,再返回上一个节点前,需要去掉该标志位。

使用递归进行回溯处理即可,注意特殊情况处理,例如,字符串数组为空或者给定的字符串为空等。

下面是本题c++代码,在牛客网上的剑指offer板块验证完成,仅供参考:

//递归查找路径,找到直接返回,找不到顺时针换方向查找
//查找的时候,将访问的结点置位。
//特殊情况:str为空或者字符数组为空。
class Solution {
public:
    bool searchPath(char* matrix, int rows, int cols, char* str, int prow, int pcol, vector<vector<bool>> &visited)
    {
        char *pChar = str;
        
        //如果已经到了字符串末尾,则返回true
        if (*pChar == '\0')
            return true;
        
        //判断是否超出边界
        if (prow < 0 || prow >= rows || pcol < 0 || pcol >= cols)
            return false;
        
        cout<<"["<<prow<<"]["<<pcol<<"]"<<endl;
        //判断是否该点已经访问过
        if (visited[prow][pcol])
            return false;
        //判断该点是否为所需字符
        if (matrix[prow*cols+pcol] == *pChar)
        {
            //设置标志位,指向下一个字符
            visited[prow][pcol] = true;
            pChar++;
            //上
            if (searchPath(matrix, rows, cols, pChar, prow-1, pcol, visited))
                return true;
            //左
            if (searchPath(matrix, rows, cols, pChar, prow, pcol-1, visited))
                return true;
            //下
            if (searchPath(matrix, rows, cols, pChar, prow+1, pcol, visited))
                return true;            
            //右
            if (searchPath(matrix, rows, cols, pChar, prow, pcol+1, visited))
                return true;   
            //本点不符合,去掉置位
            visited[prow][pcol] = false;
        }
        else
            return false;
        return false;
    }
    
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        int i = 0, j = 0;
        vector<vector<bool>> visited(rows, vector<bool>(cols, false)), &rVisited = visited;
        
        //特殊情况处理
        if (matrix == nullptr || str == nullptr || (rows == 0 && cols == 0))
            return false;
        
        //搜索路径
        for (; i < rows; i++){
            for (j = 0; j < cols; j++)
            {
                if (matrix[i*cols+j] == *str && searchPath(matrix, rows, cols, str, i, j, rVisited))
                    return true;
            }
        }
        return false;
    }
};

=============================================================================================

Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。