矩阵中的路径

矩阵中的路径

题目描述

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

学到个新算法, 回溯法, 总体思路就是递归, 一步步层层调用, 设置判断条件, 分别上下左右探索单元格四周

class Solution {
public:
    bool hasPathCore(const char* matrix, int rows, int cols, int row, int col,
                     const char* str, int &pathLength, bool *visited) {
        if ('' == str[pathLength])
            return true;
        
        bool hasPath = false;
        
        if ((row >= 0) && (row < rows) && (col >= 0) && (col < cols)    // 边界条件判断
            && (visited[cols * row + col] == false)            // 单元格没有被访问过
            && (matrix[cols * row + col] == str[pathLength])) {   // 单元格字符和路径上的字符相同
            
            visited[cols * row + col] = true;    // 把路径设置为访问过
            pathLength++;        // 字符中的路径+1
            
            hasPath = hasPathCore(matrix, rows, cols, row + 1, col, str, pathLength, visited)    // 向下探索
                   || hasPathCore(matrix, rows, cols, row, col + 1, str, pathLength, visited)    // 向右探索
                   || hasPathCore(matrix, rows, cols, row - 1, col, str, pathLength, visited)    // 向上探索
                   || hasPathCore(matrix, rows, cols, row, col - 1, str, pathLength, visited);   // 向左探索
            
            if (! hasPath) {    // 若没有找到
                pathLength--;    // 字符路径-1
                visited[cols * row + col] = false;    // 单元格设置为没访问过
            }
        }
        
        return hasPath;
    }
    
    bool hasPath(char* matrix, int rows, int cols, char* str)
    {
        if ((nullptr == matrix) || (nullptr == str) || (rows < 1) || (cols < 1))
            return false;
        
        bool *visited = new bool[rows * cols];    // 用来记录单元格是否被访问过
        //memset(visited, 0, sizeof(*visited));    // 设置0失败
        memset(visited, 0, rows * cols);
        
        int pathLength = 0;
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                if (hasPathCore(matrix, rows, cols, row, col, str, pathLength, visited)) {    // 找到这条路径
                    delete[] visited;
                    return true;
                }
            }
        }
        // 没有找到这条路径
        delete[] visited;
        return false;
    }


};
原文地址:https://www.cnblogs.com/hesper/p/10575495.html