题解 | 迷宫寻路
迷宫寻路
https://www.nowcoder.com/practice/0c8930e517444d04b426e9703d483ed4?tpId=387&tqId=11262526&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D37%26type%3D387
回溯函数只有9行代码,相当简洁并且思路清晰
import java.util.Scanner;
public class Main {
static int n;
static int m;
static boolean visited[][];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
n=in.nextInt();
m=in.nextInt();
String temp=in.nextLine();
char[][] arr=new char[n][m];
visited=new boolean[n][m];
for(int i=0;i<n;i++){
arr[i]=in.nextLine().toCharArray();
}
if(dfs(arr,0,0)){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
static boolean dfs(char[][] arr,int i,int j){
if(i<0||i>=n||j<0||j>=m) return false;
if(arr[i][j]=='#') return false;
if(arr[i][j]=='.'&&i==n-1&&j==m-1) return true;
if(visited[i][j]) return false;
visited[i][j]=true;
boolean found=dfs(arr,i-1,j)||dfs(arr,i+1,j)||dfs(arr,i,j-1)||dfs(arr,i,j+1);
return found;
}
}
在最后return 前,不需要visited[i][j]=false;因为可能出现环的情况,会一直转圈圈,导致StackOverFlow。
查看2道真题和解析