这是一个找最短路径的问题,使用BFS2来解决。
一个点的cost,等于产生它的父亲的cost和它的height的最大值。
由于路径是递增关系,所以可以dedup at generation.
这是一个经典BFS2的应用。
从每个点expand它的邻居。每个点第一次被generate出来时一定是最优的。
class Solution {
public int swimInWater(int[][] grid) {
int[][] OFFSETS = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
int N = grid.length;
int M = grid[0].length;
Queue<int[]> queue = new PriorityQueue<>(Comparator.comparingInt(a -> a[2]));
boolean[][] visited = new boolean[N][M];
queue.offer(new int[]{0, 0, grid[0][0]});
while (!queue.isEmpty()) {
int[] t = queue.poll();
if (t[0] == N - 1 && t[1] == M - 1) return t[2];
int tDay = t[2];
for (int[] os : OFFSETS) {
int nr = os[0] + t[0], nc = os[1] + t[1];
if (nr < 0 || nc < 0 || nr >= N || nc >= M) continue;
if(visited[nr][nc]) continue; //dedup at generation
visited[nr][nc] = true;
queue.offer(new int[] {nr, nc, Math.max(tDay, grid[nr][nc])});
}
}
return -1;
}
}