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;
        }
    
    
    };
    
  • 相关阅读:
    MeasureSpec学习
    android之GridView实现九宫格布局
    android 检查网络是否可用,如果不可用弹出设置,让用户改变
    Android Studio中新建项目时Your android sdk is out of date or is missing templates的解决办法
    android studio 改变主题及字体大小
    使用URL读取网络图片资源
    Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
    android获取在res文件下的图片资源
    星座物语APP
    第十三次会议
  • 原文地址:https://www.cnblogs.com/hesper/p/10575495.html
Copyright © 2011-2022 走看看