D.迷宫:左上角进,右下角出,计算出最短路径下的最小字典序
原矩阵记不清了,自己随便写了一个6*8的,用bfs比较快。
import java.util.LinkedList;
import java.util.Queue;
public class _04 {
/*
* 迷宫:左上角进,右下角出,计算出最短路径
*/
static public class Pos {
int row;
int col;
public Pos(int row, int col) {
this.row = row;
this.col = col;
}
}
public static void main(String[] args) {
// 6*8
int[][] arr = {
{ 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
};
int[][] mol = { { 1, 0 }, { 0, -1 }, { 0, 1 }, { -1, 0 } };
String[] sch = { "D", "L", "R", "U" };
// 默认false 记录走过的状态
boolean[][] flag = new boolean[6][8];
// 该队列存储格子的坐标
Queue<Pos> q = new LinkedList<>();
// 该队列存储路径
Queue<String> des = new LinkedList<>();
// 这是原点
q.add(new Pos(0, 0));
des.add("O");
flag[0][0] = true;
while (!q.isEmpty()) {
int i = q.peek().row;
int j = q.peek().col;
if (i == arr.length - 1 && j == arr[0].length - 1) {
// 直接输出路径
System.out.println(des.peek());
break;
} else {
for (int k = 0; k < 4; k++) {
if (i + mol[k][0] >= 0 && i + mol[k][0] < arr.length
&& j + mol[k][1] >= 0&& j + mol[k][1] < arr[0].length
&& arr[i + mol[k][0]][j + mol[k][1]] == 0
&& flag[i + mol[k][0]][j + mol[k][1]] == false) {
q.add(new Pos(i + mol[k][0], j + mol[k][1]));
flag[i + mol[k][0]][j + mol[k][1]] = true;
des.add(des.peek() + sch[k]);
}
}
}
q.poll();
des.poll();
}
}
}