迷宫最短路径
2019-04-09 本文已影响0人
packet
一道经典的迷宫题,在一个 m * n 的图中,找出某两个点的最短路径。
public class Path {
private int[][] maze;
private int[][] offset;
public Path(int m, int n) {
this.maze = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
maze[i][j] = ThreadLocalRandom.current().nextInt(2); // 0表示障碍
System.out.println(Arrays.toString(maze[i]));
}
this.offset = new int[][] {
{-1, 0},
{1, 0},
{0, -1},
{0, 1}
};
}
public void bfs(int x, int y) {
if (maze[x][y] == 0) {
throw new RuntimeException("no access");
}
int m = maze.length;
int n = maze[0].length;
Deque<Integer> queue = new LinkedList<>();
int[][] distinct = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
distinct[i][j] = -1;
}
distinct[x][y] = 0;
int[][] vis = new int[m][n];
queue.addLast(x * n + y);
vis[x][y] = 1;
Integer element;
while ((element = queue.poll()) != null) {
int p = element / n;
int q = element % n;
for (int i = 0; i < 4; i++) {
int a = p + offset[i][0];
int b = q + offset[i][1];
if (a >= 0 && a < m && b >= 0 && b < n && maze[a][b] == 1 && vis[a][b] == 0) {
vis[a][b] = 1;
distinct[a][b] = distinct[p][q] + 1;
queue.addLast(a * n + b);
}
}
}
System.out.println("-----------------------------");
for (int[] ints : distinct) {
System.out.println(Arrays.toString(ints));
}
System.out.println("-----------------------------");
}
public static void main(String[] args) {
Path path = new Path(8, 7);
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int x = scanner.nextInt();
int y = scanner.nextInt();
path.bfs(x, y);
}
}
}
- 采用的是BFS算法,需要一个队列,队列里的元素是整数,注意怎么和二维数组的坐标对应起来。
- 注意起点坐标x, y是怎么输入的