public int[][] updateMatrix(int[][] mat) {
int[] dx = { 1, -1, 0, 0 };
int[] dy = { 0, 0, 1, -1 };
int m = mat.length;
int n = mat[0].length;
int[][] dist = new int[m][n];
Queue<int[]> q = new LinkedList<>();
// 初始化, 加入队列
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mat[i][j] == 0) {
dist[i][j] = 0;
q.offer(new int[] { i, j });
} else {
dist[i][j] = -1;
}
}
}
// 扩展
while (!q.isEmpty()) {
int[] t = q.poll();
int a = t[0];
int b = t[1];
for (int i = 0; i < 4; i++) {
int x = a + dx[i];
int y = b + dy[i];
if (x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1) {
q.offer(new int[] { x, y });
dist[x][y] = dist[a][b] + 1;
}
}
}
return dist;
}
public int numEnclaves(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[] dx = {0, 0, 1, -1};
int[] dy = {1, -1, 0, 0};
boolean[][] vis = new boolean[m][n];
Queue<int[]> q = new LinkedList<>();
// 初始化队列和标记
for (int i = 0; i < m; i++) {
if (grid[i][0] == 1) {
q.offer(new int[]{i, 0});
vis[i][0] = true;
}
if (grid[i][n - 1] == 1) {
q.offer(new int[]{i, n - 1});
vis[i][n - 1] = true;
}
}
for (int j = 0; j < n; j++) {
if (grid[0][j] == 1) {
q.offer(new int[]{0, j});
vis[0][j] = true;
}
if (grid[m - 1][j] == 1) {
q.offer(new int[]{m - 1, j});
vis[m - 1][j] = true;
}
}
while(!q.isEmpty()) {
int[] t = q.poll();
int a = t[0];
int b = t[1];
for (int i = 0; i < 4; i++) {
int x = a + dx[i];
int y = b + dy[i];
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == 1) {
q.offer(new int[]{x, y});
vis[x][y] = true;
}
}
}
int ret = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1 && !vis[i][j]) {
ret++;
}
}
}
return ret;
}
public int[][] highestPeak(int[][] isWater) {
int[] dx = { 0, 0, 1, -1 };
int[] dy = { 1, -1, 0, 0 };
int m = isWater.length;
int n = isWater[0].length;
int[][] ret = new int[m][n];
Queue<int[]> q = new LinkedList<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ret[i][j] = -1;
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (isWater[i][j] == 1) {
q.offer(new int[] { i, j });
ret[i][j] = 0;
}
}
}
while (!q.isEmpty()) {
int[] t = q.poll();
int a = t[0];
int b = t[1];
for (int i = 0; i < 4; i++) {
int x = a + dx[i];
int y = b + dy[i];
if (x >= 0 && x < m && y >= 0 && y < n && ret[x][y] == -1) {
q.offer(new int[] { x, y });
ret[x][y] = ret[a][b] + 1;
}
}
}
return ret;
}
public int maxDistance(int[][] grid) {
int[] dx = { 0, 0, 1, -1 };
int[] dy = { 1, -1, 0, 0 };
int m = grid.length;
int n = grid[0].length;
int[][] dist = new int[m][n];
Queue<int[]> q = new LinkedList<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dist[i][j] = -1;
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
dist[i][j] = 0;
q.offer(new int[]{i, j});
}
}
}
int ret = -1;
while(!q.isEmpty()) {
int[] t = q.poll();
int a = t[0];
int b = t[1];
for (int i = 0; i < 4; i++) {
int x = a + dx[i];
int y = b + dy[i];
if (x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1) {
q.offer(new int[]{x, y});
dist[x][y] = dist[a][b] + 1;
ret = Math.max(dist[x][y], ret);
}
}
}
return ret;
}