目录
一、问题描述
二、解题思路
1.返回格式
这个题目的问题返回格式是Point(x,y);x代表最短路径距离,y表示最短路径数量
如果没有从S->E的通路则返回new Point(-1,-1)
2.使用深度遍历
这里巧妙地将遍历过后的位置元素设为'T',避免重复访问产生回路,等dfs完成后将该位置元素还原为'.',方便上层递归调用尝试其他的方案。
3.注意上下左右的实现方式
int[] dx={0,0,-1,1};//上下左右
int[] dy={1,-1,0,0};
这里x指的列,y指的行,所以dx指的上下左右对应列变化,dy指的上下左右对应行的变化
三、代码实现
import java.util.*;
/*
* public class Point {
* int x;
* int y;
* public Point(int x, int y) {
* this.x = x;
* this.y = y;
* }
* }
*/
public class Solution {
int minLen=Integer.MAX_VALUE;//记录最短路径距离
int pathNum=0;//记录最短路径数量
int[] dx={0,0,-1,1};//上下左右
int[] dy={1,-1,0,0};
int rowLen=0,colLen=0;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param forest char字符型二维数组
* @return Point类
*/
public Point findPath (char[][] forest) {
rowLen=forest.length;
colLen=forest[0].length;
//定位牛牛起始位置
for(int i=0;i<rowLen;i++){
for(int j=0;j<colLen;j++){
if(forest[i][j]=='S'){
dfs(forest,i,j,0);
break;
}
}
}
if(pathNum==0){
return new Point(-1,-1);
}else{
return new Point(minLen,pathNum);
}
}
public void dfs(char[][] forest,int y,int x,int steps){
if(forest[y][x]=='E'){
if(steps==minLen){
pathNum++;
}else if(steps>minLen){
//此时pathNum不变
}else{
minLen=steps;
pathNum=1;
}
return;
}else{
//巧用'T'来避免深度递归遍历中后退情况
forest[y][x]='T';
for(int idx=0;idx<dx.length;idx++){
int nowx=x+dx[idx];//列
int nowy=y+dy[idx];//行
if(nowx<colLen&&nowx>=0&&nowy<rowLen&&nowy>=0){
if(forest[nowy][nowx]!='T'){
dfs(forest,nowy,nowx,steps+1);
}
}
}
//在递归完成后将此处设置为'.',复原为可访问状态,方便尝试其他方案
forest[y][x]='.';
}
}
}
说明:这个测试用例的预期输出是错误的,应该是(6,3)