• 矩阵中的路径


    矩阵中的路径

    题目描述

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 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;
        }
    
    
    };
    
  • 相关阅读:
    Codeforces Round #647 (Div. 2)
    Codeforces Round #647 (Div. 2)
    Codeforces Round #647 (Div. 2)
    “科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛(ABDF)
    POJ3764 The xor-longest Path(异或/01Trie)
    06.Python网络爬虫之requests模块(2)
    05.Python网络爬虫之三种数据解析方式
    04.Python网络爬虫之requests模块(1)
    03.Python网络爬虫第一弹《Python网络爬虫相关基础概念》
    02.Python网络爬虫第二弹《http和https协议》
  • 原文地址:https://www.cnblogs.com/hesper/p/10575495.html
Copyright © 2020-2023  润新知