题解 | #迷宫问题#
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
深度优先,其实不用那么代码,把代码的动作归纳一下就行
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
private static List<List<ZuoBiao>> shortPath = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int a = in.nextInt();
int b = in.nextInt();
int[][] mg = new int[a][b];
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++) {
mg[i][j] = in.nextInt();
}
}
move(mg, new ZuoBiao(0, 0), new ArrayList<>(), new HashSet<>());
Collections.sort(shortPath, new Comparator<List<ZuoBiao>>() {
@Override
public int compare(List<ZuoBiao> o1, List<ZuoBiao> o2) {
return o1.size() - o2.size();
}
});
for (ZuoBiao zuoBiao : shortPath.get(0)) {
System.out.println(zuoBiao);
}
}
}
private static void move(int[][] mg, ZuoBiao curZB, ArrayList<ZuoBiao> steps,
Set<String> zbJL) {
//结束条件 x ,y 等 mg 的两个length-1
steps.add(curZB);
zbJL.add(curZB.toString());
if (curZB.x == mg.length - 1 && curZB.y == mg[0].length - 1) {
//如果走完,则记录一条记录
List<ZuoBiao> zuoBiaos = new ArrayList<>();
zuoBiaos.addAll(steps);
shortPath.add(zuoBiaos);
return;
}
// 向左
//没有碰壁
if (curZB.y - 1 >= 0 && mg[curZB.x][curZB.y - 1] != 1) {
ZuoBiao zuoBiao = new ZuoBiao(curZB.x, curZB.y - 1);
// 不走回头路
if (!zbJL.contains(zuoBiao.toString())) {
move(mg, zuoBiao, steps, zbJL);
steps.remove(steps.size() - 1);
zbJL.remove(zuoBiao.toString());
}
}
// 向右
if (curZB.y + 1 < mg[0].length && mg[curZB.x][curZB.y + 1] != 1) {
ZuoBiao zuoBiao = new ZuoBiao(curZB.x, curZB.y + 1);
if (!zbJL.contains(zuoBiao.toString())) { //防止走回头路
move(mg, zuoBiao, steps, zbJL);
//退回原来的步
steps.remove(steps.size() - 1);
zbJL.remove(zuoBiao.toString());
}
}
// 向下
if (curZB.x + 1 < mg.length && mg[curZB.x + 1][curZB.y] != 1) {
ZuoBiao zuoBiao = new ZuoBiao(curZB.x + 1, curZB.y);
if (!zbJL.contains(zuoBiao.toString())) { //防止走回头路
move(mg, zuoBiao, steps, zbJL);
steps.remove(steps.size() - 1);
zbJL.remove(zuoBiao.toString());
}
}
// 向上
if (curZB.x - 1 >= 0 && mg[curZB.x - 1][curZB.y] != 1) {
ZuoBiao zuoBiao = new ZuoBiao(curZB.x - 1, curZB.y);
if (!zbJL.contains(zuoBiao.toString())) { //防止走回头路
move(mg, zuoBiao, steps, zbJL);
steps.remove(steps.size() - 1);
zbJL.remove(zuoBiao.toString());
}
}
}
public static class ZuoBiao {
int x;
int y;
public ZuoBiao(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "(" + x + "," + y + ")";
}
}
}
阿里云工作强度 585人发布
查看13道真题和解析
