Advertisement
Dmaxiya

兔子逃跑测试 3

Oct 8th, 2022
1,255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.99 KB | None | 0 0
  1. public class Solution {
  2.     static class Node {
  3.         int x;
  4.         int y;
  5.         int status;
  6.  
  7.         public Node(int x, int y, int status) {
  8.             this.x = x;
  9.             this.y = y;
  10.             this.status = status;
  11.         }
  12.     }
  13.  
  14.     private static int n;
  15.     private static int m;
  16.     private static int[][][] dis;
  17.     private static final int INF = 0x3f3f3f3f;
  18.     private static int[][] G;
  19.     private static Queue<Node> que = new ArrayDeque<>();
  20.     private static final int[][] dir = new int[][]{
  21.             {0, 1}, {0, -1}, {1, 0}, {-1, 0}
  22.     };
  23.  
  24.     public static int solution(int[][] map) {
  25.         init(map);
  26.         bfs();
  27.         int ans = Math.min(dis[n - 1][m - 1][0], dis[n - 1][m - 1][1]);
  28.         return ans == INF ? -1 : ans;
  29.     }
  30.  
  31.     private static void init(int[][] map) {
  32.         n = map.length;
  33.         m = map[0].length;
  34.         dis = new int[n][m][2];
  35.         for (int i = 0; i < n; ++i) {
  36.             for (int j = 0; j < m; ++j) {
  37.                 dis[i][j][0] = INF;
  38.                 dis[i][j][1] = INF;
  39.             }
  40.         }
  41.         Solution.G = map;
  42.  
  43.         while (!que.isEmpty()) {
  44.             que.poll();
  45.         }
  46.     }
  47.  
  48.     private static void bfs() {
  49.         que.add(new Node(0, 0, 0));
  50.         dis[0][0][0] = 1;
  51.  
  52.         while (!que.isEmpty()) {
  53.             Node tmp = que.poll();
  54.             for (int i = 0; i < 4; ++i) {
  55.                 int x = tmp.x + dir[i][0];
  56.                 int y = tmp.y + dir[i][1];
  57.                 if (!in(x, y) || G[x][y] + tmp.status > 1) {
  58.                     continue;
  59.                 }
  60.                 if (dis[x][y][tmp.status + G[x][y]] > dis[tmp.x][tmp.y][tmp.status] + 1) {
  61.                     dis[x][y][tmp.status + G[x][y]] = dis[tmp.x][tmp.y][tmp.status] + 1;
  62.                     que.add(new Node(x, y, tmp.status + G[x][y]));
  63.                 }
  64.             }
  65.         }
  66.     }
  67.  
  68.     public static boolean in(int x, int y) {
  69.         return x >= 0 && x < n && y >= 0 && y < m;
  70.     }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement