参考代码:
import java.util.*;
public class Main {
public static ArrayList<int[]> path = new
ArrayList<>();//搜索所有可能的路径
public static ArrayList<int[]> best_path = new ArrayList<>();//最短路径
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
path.clear();
best_path.clear();//每个用例之前,都要清空下路径
int n = in.nextInt();
int m = in.nextInt();
int[][] maze = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
maze[i][j] = in.nextInt();
}
}
dfs(0, 0, maze); //深搜+回溯
for (int[] pathi : best_path) {
System.out.println("(" + pathi[0] + "," + pathi[1] + ")");
}
}
}
public static void dfs(int i, int j, int[][] maze) {
//越界了
if (i < 0 || i > maze.length - 1 || j < 0 || j > maze[0].length - 1) {
return;
}
//撞墙了
if (maze[i][j] == 1) {
return;
}
//终止条件,找到终点了
if (i == maze.length - 1 && j == maze[0].length - 1) {
path.add(new int[] {maze.length - 1, maze[0].length - 1}); //添加终点
if (best_path.size() == 0 ||
path.size() < best_path.size()) { //遇到更短的路径
best_path.clear();//清空之前的路径
for (int[] path0 : path) {
best_path.add(path0);
}
}
return;
}
maze[i][j] = 1;//标记走过的点
path.add(new int[] {i, j}); //添加到路径中
dfs(i - 1, j, maze);
dfs(i + 1, j, maze);
dfs(i, j - 1, maze);
dfs(i, j + 1, maze); //以i j为中心,上下左右搜索
maze[i][j] = 0;//回溯,恢复到之前的状态
path.remove(path.size() - 1); //回溯,移除最后一个点
}
}