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