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

    题目描述

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
     
    思路:拿到题目首先好好思考,看清楚接口,整体思路是每个点作为start点,然后调用另外的递归函数进行上下左右的寻找是否和目标字符串的当前字符相等。
    首先matrix是一个一维指针,需要i * 列数 + j遍历得到每个数,然后就是递归基,要有返回正确的和错误的情况,字符串指针等于==nullptr是属于判断指针的情况,字符串的结尾是'';因为ij有加减操作,所以要判断是否大于rows,cols。
    核心是回溯,因为传递给helper的是指针,当前元素如果访问了,就会被修改,修改的是原始数据,回溯法需要每次修改后回溯后之前的状态,所以要保存之前的状态,然后再递归之后修改回来。
     
     
     
     
    class Solution {
    public:
        bool helper(char* matrix, int rows, int cols, char* str,int i,int j){
            if(*str == ''){
                return true;
            }
            if(i < 0 || j < 0 || i >= rows || j >= cols){
                return false;
            }
            if(matrix[i * cols + j] != *str){
                return false;
            }  
            bool res = false;
            matrix[i * cols + j] = '@';
           
            res = helper(matrix,rows,cols,str + 1,i - 1,j) ||
            helper(matrix,rows,cols,str + 1,i + 1,j) ||
            helper(matrix,rows,cols,str + 1,i,j - 1) ||
            helper(matrix,rows,cols,str + 1,i,j + 1);
            
            matrix[i * cols + j] = *str;
            return res;
        }
        bool hasPath(char* matrix, int rows, int cols, char* str){    
            if(matrix == nullptr || rows <= 0 || cols <= 0 || str == nullptr){
                return false;
            }
            bool res  = false;
            for(int i = 0;i < rows;++i){
                for(int j = 0;j < cols;++j){  
                    if(matrix[i * cols + j] == *str){
                        res = helper(matrix,rows,cols,str,i,j);
                        if(res == true){
                            return true;
                        }
                    }
                    
                }
            }
            return res;
        }
    
    };
  • 相关阅读:
    Overloaded的方法是否可以改变返回值的类型
    parseXXX的用法
    java的类型转换问题。int a = 123456;short b = (short)a;System.out.println(b);为什么结果是-7616?
    UVA 10405 Longest Common Subsequence(简单DP)
    POJ 1001 Exponentiation(大数处理)
    POJ 2318 TOYS(计算几何)(二分)
    POJ 1265 Area (计算几何)(Pick定理)
    POJ 3371 Flesch Reading Ease (模拟题)
    POJ 3687 Labeling Balls(拓扑序列)
    POJ 1094 Sorting It All Out(拓扑序列)
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8480195.html
Copyright © 2011-2022 走看看