剑指offer 12 矩阵中的路径

本题的算法思路一开始不清楚
public class Solution {
    public static boolean hasPath(char[] matrix, int rows, int cols, char[] str)
    {
        if(str.length==0)
            return false;
        boolean [][] marked=new boolean[rows][cols];
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                marked[i][j]=false;
            }
        }
        char [][]data=buildmatrix(matrix,rows,cols);
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                if(pathExit(data,marked,i,j,str,0)){
                    return true;
                }
            }
        }
        return false;
    }
    public static boolean pathExit(char [][]matrix,boolean [][] visit,int i,int j,char[]str,int count){
        int row=matrix.length;
        int col=matrix[0].length;
        //这个if语句debug了很久... matrix[i][j]!=str[count]需要放在i j是否出界后再判断,要不会数组越界
               //因为无法保证matrix[i][j]中的i j是否合法!!
                if(i<0 || j<0 || i>row-1 || j>col-1 || matrix[i][j]!=str[count]||visit[i][j]==true){
            return false;
        }
        if(count==str.length-1&&matrix[i][j]==str[count])
            return true;
        visit[i][j]=true;
        boolean res=pathExit(matrix,visit,i,j+1,str,count+1)||pathExit(matrix,visit,i,j-1,str,count+1)||
                pathExit(matrix,visit,i+1,j,str,count+1)||pathExit(matrix,visit,i-1,j,str,count+1);
        visit[i][j]=false;//记得重置visit数组
        return res;//返回的是下面的字符能否组成str,一层一层向上返回
    }

    public static char[][] buildmatrix(char []array, int row, int col){
        char [][]matrix=new char[row][col];
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                matrix[i][j]=array[col*i+j];//如何计算取出char元素的下标需要注意
            }
        }
        return matrix;
    }

}


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务