给定一个的网格,在网格中每次在不超过边界的情况下可以选择向上、向下、向左、向右移动一格。网格中的一些格子上放置有障碍物,放有障碍物的格子不能到达。求从到最少的移动次数。若不能到达,输出。
区块链毕设网qklbishe.com为您提供问题的解答
给定一个的网格,在网格中每次在不超过边界的情况下可以选择向上、向下、向左、向右移动一格。网格中的一些格子上放置有障碍物,放有障碍物的格子不能到达。求从到最少的移动次数。若不能到达,输出。
使用dfs会导致溢出,选用bfs合适
import java.util.*; class pair { int x = 0; int y = 0; public pair(int x, int y) { this.x = x; this.y = y; } } public class Main { Queue<pair> q = new LinkedList<>(); int t[][] = new int[1000][1000]; boolean b[][] = new boolean[1000][1000]; static int dx[] = { -1, 0, 1, 0 }; static int dy[] = { 0, 1, 0, -1 }; int bfs(int n, int m, int x, int y, int x0, int y0, char z[][]) { for (int k = 0; k < t.length; k++) for (int l = 0; l < t[k].length; l++) { t[k][l] = -1; } for (int d = 0; d < b.length; d++) for (int f = 0; f < b[d].length; f++) { b[d][f] = false; } b[x][y] = true; q.offer(new pair(x, y)); while (!q.isEmpty()) { int x1, y1; x1 = q.peek().x; y1 = q.peek().y; q.poll(); for (int i = 0; i < 4; i++) { int x2 = x1 + dx[i], y2 = y1 + dy[i]; if (x2 >= 0 && x2 <= n - 1 && y2 >= 0 && y2 <= m - 1 && b[x2][y2] == false && z[x2][y2] == '.') { b[x2][y2] = true; t[x2][y2] = t[x1][y1] + 1; q.offer(new pair(x2, y2)); } } } return t[x0][y0] + 1; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int x = in.nextInt(); int y = in.nextInt(); int x0 = in.nextInt(); int y0 = in.nextInt(); char[][] z = new char[n][]; for (int i = 0; i < n; i++) { z[i] = in.next().toCharArray(); } Main mi = new Main(); if (mi.bfs(n, m, x - 1, y - 1, x0 - 1, y0 - 1, z) == 0) System.out.println(-1); else System.out.println(mi.bfs(n, m, x - 1, y - 1, x0 - 1, y0 - 1, z)); } }
59:29
以上就是关于问题给定一个的网格,在网格中每次在不超过边界的情况下可以选择向上、向下、向左、向右移动一格。网格中的一些格子上放置有障碍物,放有障碍物的格子不能到达。求从到最少的移动次数。若不能到达,输出。的答案
欢迎关注区块链毕设网-
专业区块链毕业设计成品源码,定制。
区块链NFT链游项目方科学家脚本开发培训