目录
一、问题描述
二、解题思路
1.返回格式
2.使用深度遍历
3.注意上下左右的实现方式
三、代码实现
四、刷题链接
一、问题描述
二、解题思路
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)
四、刷题链接
牛牛的果实迷宫_牛客题霸_牛客网