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

    矩阵中的路径

    题目描述

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 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;
        }
    
    
    };
    
  • 相关阅读:
    SQL Server 存储过程
    Prettier
    VSCode常用插件之open in browser使用
    VSCode常用插件之vscode-fileheader使用
    (四)Vue面试题解析,目标高级前端开发者必经之路
    (三)Vue必考面试题解析,继续向高级前端迈进
    (二)Vue常见面试题,向高级前端开发迈进
    (一)Vue常见面试题,看看你都会了吗?
    Vue2.x 开发必须知道的 36 个技巧
    开箱即用 vue-cli4 vant rem 移动端框架方案
  • 原文地址:https://www.cnblogs.com/hesper/p/10575495.html
Copyright © 2011-2022 走看看