剑指Offer刷题笔记(java实现)_12_矩阵中的路径

设计一个函数,用来判断一个矩阵中是否存在一条包含某字符串所有字符路径,起点可以从任意一格开始,并且不能重复踏入同一个格子

例如  a b t g

         c f  c s

         j d e h

如果给定一个bfce ,那么我们从b走向下到f向右到c向下到e说明有这个字符串的路径

解题思路:按照上下左右的顺序,依次试探,如果到了死路,则一直回溯到上一个可用节点

package Offer12_path;

import java.util.Scanner;

/*
*     12.矩阵中的路径
*
*      思路:像这种回溯的算法第一时间想到的就是递归
*      思考:1.首先我们不知道从那个点开始算起,并且,一个矩阵中可能有多起点,因此我们应该用一个二重循环遍历所有的起点。
*            2.我们书写一个函数,用来判断是否有字符串这样的路径,返回true或者false通过一个返回值
*            3.我们需要一个数组记录某节点是否被访问过
* */
public class ArrayPath {

    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        String str=sc.next();//接受输入的路径字符串
        char[][] matrix1=new char[][]{{'d','f','s','h','a'},{'q','h','z','h','l'},{'n','o','h','z','s'}
        ,{'b','u','y','t','m'},{'g','b','t','n','a'}};
        char[][] matrix=new char[][]{{'d','f','s','h'},{'q','h','z','h'},{'n','o','h','z'}
                ,{'b','u','y','t'}};
        boolean gone[]=new boolean[matrix.length*matrix[0].length];//建立一个能容纳矩阵所有元素的数组

        //用一个二层循环来遍历所有起点
        for (int i = 0; i <matrix[0].length ; i++) {
            for (int j = 0; j <matrix.length ; j++) {
                   if (hasPath(matrix,gone,str,i,j,0)){
                       System.out.println("有这样的路径,结束");
                       return ;
                   }
            }
        }
    }

    /*
    *                       参数解释:   字符数组      走过的路径   路径字符串   起点下标      字符串位置索引
      * */
    public static boolean hasPath(char[][] matrix,boolean[] gone ,String str,int i, int j, int k ){
         /*
         *   递归遍历上下左右四个元素,如果没有可达路径回溯至之前最近的一个可达节点
         * */
         int index=i*matrix.length+j;
         //判断条件:i,j不越界,并且这个点没被访问过并且这个结点的值符合字符串的值
         if (matrix.length<i||i<0||j<0||matrix[0].length<j||gone[index]||str.charAt(k)!=matrix[i][j])
            return false;

         //当遍历到最后一个字符时结束
        if (k==str.length()-1)
            return true;


        //如果经过合法判断,那么我们就证明到了这个点设置为走过
        gone[index]=true;
        //递归进行上下左右判断
         if(hasPath(matrix,gone,str,i+1,j,k+1)||hasPath(matrix,gone,str,i,j+1,k+1)
        ||hasPath(matrix,gone,str,i-1,j,k+1)||hasPath(matrix,gone,str,i,j-1,k+1)){
             return  true;
         }
         gone[index]=false;
         return false;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值