ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

剑指offer12:矩阵中的路径

2020-10-28 22:04:15  阅读:142  来源: 互联网

标签:&& index matrix 路径 矩阵 cols offer12 str flagMatrix


题目描述

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

 思路:回溯法

public class Solution {
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
    {
        if(str.length == 0) return false;
        for(int i = 0;i < rows;i++){
            for(int j = 0;j<cols;j++){
                if(matrix[i*cols+j] == str[0]){
                    int[] flagMatrix = new int[rows*cols];
                    boolean flag = hasPath(matrix,cols,str,0,flagMatrix,i,j);
                    if(flag == true)
                        return true;
                }
            }
        }
        return false;
    }
    public static boolean hasPath(char[] matrix, int cols,
                    char[] str,int index,int[] flagMatrix,int i,int j){
        if(index == str.length)
            return true;
        if(i*cols+j>=matrix.length || i*cols+j < 0)
            return false;
        if(str[index] != matrix[i*cols+j] || flagMatrix[i*cols+j]==1)
            return false;
        if(str[index] == matrix[i*cols+j] && flagMatrix[i*cols+j]==0){
            flagMatrix[i*cols+j] = 1;
        }
        return hasPath(matrix,cols,str,index+1,flagMatrix,i-1,j)||
                hasPath(matrix,cols,str,index+1,flagMatrix,i,j+1)||
                hasPath(matrix,cols,str,index+1,flagMatrix,i+1,j)||
                hasPath(matrix,cols,str,index+1,flagMatrix,i,j-1);
    }
}

刚开始的错误解法:

if(judgeBound(i-1,j,cols,matrix.length) && matrix[(i-1)*cols+j] == str[index+1] && flagMatrix[i-1][j] == 0){//上
            return hasPath(matrix,cols,str,index+1,flagMatrix,i-1,j);
        }
        else if(judgeBound(i,j+1,cols,matrix.length) && matrix[i*cols+j+1] == str[index+1] && flagMatrix[i][j+1] == 0){//右
            return hasPath(matrix,cols,str,index+1,flagMatrix,i,j+1);
        }
        else if(judgeBound(i+1,j,cols,matrix.length) && matrix[(i+1)*cols+j] == str[index+1] && flagMatrix[i+1][j] == 0){//下
            return hasPath(matrix,cols,str,index+1,flagMatrix,i+1,j);
        }else if(judgeBound(i,j-1,cols,matrix.length) &&matrix[i*cols+j-1] == str[index+1] && flagMatrix[i][j-1] == 0){//左
            return hasPath(matrix,cols,str,index+1,flagMatrix,i,j-1);
        }else{
            return false;
        }

上边代码错误的原因:我们应当上右下左进行利用或的关系进行判断,只要有一个方向满足即可继续往下走,但是上边的代码只要有一个方向返回true或false就直接跳出递归返回。

 

标签:&&,index,matrix,路径,矩阵,cols,offer12,str,flagMatrix
来源: https://www.cnblogs.com/ttzz/p/13893765.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有