题目:
题解:
轮询所有节点作为寻找矩阵的开始之处,使用dfs的方式解题,因为回溯比较抽象,写了一个打印函数,轻松看出当前走到了哪里(0所在的地方为当前所找,| 为矩阵之外的边界,- 为题目矩阵):
package FindPath;
import java.util.Arrays;
public class FindPath{
public static void main(String[] args) {
char[] matrix = {'a','b','c','e','s','f','c','s','a','d','e','e'};
int rows = 3;
int cols=4;
char[] str = {'a','b','a'};
FindPath dd=new FindPath();
boolean b= dd.hasPath(matrix, rows, cols, str);
System.out.println("res:"+b);
}
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
System.out.println(matrix);
boolean[] visited = new boolean[matrix.length];
for (int i=0;i<rows;i++)
for(int j=0;j<cols;j++){
System.out.println("**************************************************************");
boolean resn=judge(matrix, rows, cols, i, j, str, 0, visited);
System.out.println("本次的查找结果resn:"+resn);
if(resn == true) {
return true;
}
}
return false;
}
public boolean judge(char[] matrix,int rows,int cols,int i,int j, char[] str,int k,boolean[] visited){
int index = i*cols+j;
printMatric(i,j);
// 如果走到边缘 || 如果下个字符不是要找的 || 如果已经找过了
if (i<0 ||j<0 || i>=rows || j>=cols|| matrix[index]!=str[k] || visited[index]==true){
System.out.println(" i="+i+" j="+j+" return false");
return false;
}
// 已经找到了第k个字符
if(k==str.length-1) {
String s=String.valueOf(str);
System.out.println("k="+k+" "+s.substring(0,k+1)+" ");
return true;
}
// 找到的字母不可以再找 否则路径会成环 出现错误
visited[i]=true;
System.out.println(matrix[index]+"=="+str[k] +":"+(matrix[index]==str[k]));
// 继续在目前字符的周围找下一个字符
if(judge(matrix,rows,cols,i-1,j,str,k+1,visited)||
judge(matrix,rows,cols,i+1,j,str,k+1,visited)||
judge(matrix,rows,cols,i,j-1,str,k+1,visited)||
judge(matrix,rows,cols,i,j+1,str,k+1,visited)){
System.out.println(" return true");
return true;
}
System.out.println("寻找下一个节点"+Arrays.toString(visited));
//
visited[i]=false;
return false;
}
public void printMatric(int i,int j) {
System.out.println("===============================\n i:"+i+" j:"+j);
String[][] m ={
{"|","|","|","|","|","|"},
{"|","-","-","-","-","|"},
{"|","-","-","-","-","|"},
{"|","-","-","-","-","|"},
{"|","|","|","|","|","|"}};
try {
m[i+1][j+1]="0";
for (String[] each : m) {
System.out.println(Arrays.toString(each));
}
} catch (Exception e) {
// e.printStackTrace();
}
}
}