离散化 + bfs,参考题解
class Solution {
int N = 1000000, M = 610, n, m;
boolean[][] st = new boolean[M][M];
void add(List<Integer> list, int p) {
if (p > 0) list.add(p - 1);
if (p + 1 < N) list.add(p + 1);
list.add(p);
}
int find(List<Integer> list, int x) {
return Collections.binarySearch(list, x);
}
boolean bfs(int sx, int sy, int ex, int ey) {
int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
Deque<int[]> q = new ArrayDeque<>();
q.offer(new int[]{sx, sy});
st[sx][sy] = true;
while (!q.isEmpty()) {
var t = q.poll();
for (int i = 0; i < 4; i++) {
int a = t[0] + dx[i], b = t[1] + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m || st[a][b]) continue;
if (a == ex && b == ey) return true;
q.offer(new int[]{a, b});
st[a][b] = true;
}
}
return false;
}
public boolean isEscapePossible(int[][] blocked, int[] source, int[] target) {
List<Integer> xs = new ArrayList<>(), ys = new ArrayList<>();
add(xs, source[0]); add(xs, target[0]);
add(ys, source[1]); add(ys, target[1]);
for (int[] b : blocked) {
add(xs, b[0]);
add(ys, b[1]);
}
xs = xs.stream().sorted().distinct().toList();
ys = ys.stream().sorted().distinct().toList();
n = xs.size(); m = ys.size();
for (int[] b : blocked) {
int x = find(xs, b[0]), y = find(ys, b[1]);
st[x][y] = true;
}
return bfs(find(xs, source[0]), find(ys, source[1]), find(xs, target[0]), find(ys, target[1]));
}
}