问题描述
小老鼠走迷宫的问题是一样的解法
代码
import java.util.Arrays;
/**
* 矩阵中的路径
* @author 楠
*
*/
public class JZ65 {
/**
* 思路:
* 从矩阵中的每一个点开始遍历,判断是否存在题目中说的路径
* 矩阵开始的点应该和字符串中的第一个字符是相等的
* 每一次判断是否存在这样的路径就是使用递归,向四个方向不断查找,如果查找失败的情况下就需要回溯到上一个结点
*
* @param args
*/
public static void main(String[] args) {
char[][] matrix= {{'a','b'},{'c','d'}};
String word="cdba";
boolean hasPath = hasPath(matrix, word);
System.out.println(hasPath);
}
public static boolean hasPath (char[][] matrix, String word) {
if(matrix.length==0) {
return false;
}else if (matrix.length==1&&word.length()==1) {
if(matrix[0][0]!=word.charAt(0)) {
return false;
}else {
return true;
}
}
/**
* 这里建立的数组是比传入的数组的长度大2的,目的是为了防止数组角标越界
* isVisited是用来标识的,因为不可以重复走一个点,
*/
char[][] arr=new char[matrix.length+2][matrix[0].length+2];
boolean[][] isVisited=new boolean[matrix.length+2][matrix[0].length+2];
Arrays.fill(isVisited[0], true);
Arrays.fill(isVisited[isVisited.length-1], true);
for(int i=1;i<=arr.length-2;i++) {
for(int j=0;j<arr[0].length;j++) {
if(j==0||j==arr[0].length-1) {
isVisited[i][j]=true;
}else {
arr[i][j]=matrix[i-1][j-1];
}
}
}
for(int i=1;i<arr.length-1;i++) {
for(int j=1;j<arr[0].length-1;j++) {
if(arr[i][j]==word.charAt(0)) {
isVisited[i][j]=true;
if(check(arr, isVisited, word,i,j,1)) {
return true;
}
isVisited[i][j]=false;
}
}
}
return false;
}
public static boolean check(char[][] arr,boolean[][] isVisited,String word,int i,int j,int n) {
if(n==word.length()) {
return true;
}
//右
if(!isVisited[i][j+1]&&arr[i][j+1]==word.charAt(n)) {
isVisited[i][j+1]=true;
if(!check(arr, isVisited, word, i, j+1, n+1)) {
isVisited[i][j+1]=false;
}else {
return true;
}
}
//下
if(!isVisited[i+1][j]&&arr[i+1][j]==word.charAt(n)) {
isVisited[i+1][j]=true;
if(!check(arr, isVisited, word, i+1, j, n+1)) {
isVisited[i+1][j]=false;
}else {
return true;
}
}
//左
if(!isVisited[i][j-1]&&arr[i][j-1]==word.charAt(n)) {
isVisited[i][j-1]=true;
if(!check(arr, isVisited, word, i, j-1, n+1)) {
isVisited[i][j-1]=false;
}else {
return true;
}
}
//上
if(!isVisited[i-1][j]&&arr[i-1][j]==word.charAt(n)) {
isVisited[i-1][j]=true;
if(!check(arr, isVisited, word, i-1, j, n+1)) {
isVisited[i-1][j]=false;
}else {
return true;
}
}
return false;
}
}