题解 | #迷宫问题#
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static List<String> minPath;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m=in.nextInt(), n = in.nextInt();
int[][]arr=new int[m][n];
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
arr[i][j] = in.nextInt();
}
}
List<String> cur = new ArrayList<>();
cur.add("(0,0)");
dfs(arr, m, n, 0, 0,cur, new HashSet<>());
for(String str: minPath) {
System.out.println(str);
}
}
public static void dfs(int[][]arr, int m, int n, int i, int j, List<String> curPath, Set<String> visited) {
if(i<0||i>=m || j<0||j>=n) {
return;
}
if(i == m-1 && j == n-1) {
if(minPath == null || curPath.size()<minPath.size()) {
minPath = new ArrayList<>(curPath);
}
return;
}
if(i+1<=m-1 && arr[i+1][j]==0 && !visited.contains("("+(i+1)+","+j+")")) {
String key = "("+(i+1)+","+j+")";
visited.add(key);
curPath.add(key);
dfs(arr, m, n, i+1, j, curPath, visited);
curPath.remove(curPath.size()-1);
visited.remove(key);
}
if(i-1>=0 && arr[i-1][j]==0 && !visited.contains("("+(i-1)+","+j+")")) {
String key = "("+(i-1)+","+j+")";
visited.add(key);
curPath.add(key);
dfs(arr, m, n, i-1, j, curPath, visited);
curPath.remove(curPath.size()-1);
visited.remove(key);
}
if(j+1<=n-1 && arr[i][j+1]==0 && !visited.contains("("+(i)+","+(j+1)+")")) {
String key = "("+i+","+(j+1)+")";
visited.add(key);
curPath.add(key);
dfs(arr, m, n, i, j+1, curPath, visited);
curPath.remove(curPath.size()-1);
visited.remove(key);
}
if(j-1>=0 && arr[i][j-1]==0 && !visited.contains("("+(i)+","+(j-1)+")")) {
String key = "("+i+","+(j-1)+")";
visited.add(key);
curPath.add(key);
dfs(arr, m, n, i, j-1, curPath, visited);
curPath.remove(curPath.size()-1);
visited.remove(key);
}
}
}

查看11道真题和解析