你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。
我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。
如果我们的地图上只有陆地或者海洋,请返回 -1。
示例 1:
输入:[[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释:
海洋区域 (1, 1) 和所有陆地区域之间的距离都达到最大,最大距离为 2。
示例 2:
输入:[[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释:
海洋区域 (2, 2) 和所有陆地区域之间的距离都达到最大,最大距离为 4。
提示:
1 <= grid.length == grid[0].length <= 100
grid[i][j] 不是 0 就是 1
思路:多元最短路问题,我们设所有陆地点为起点,所有海洋点为终点跑一波最短路,所求的dis数组即为相应海洋点到陆地的最短距离。
class Solution {
private int mx=1000000;
private int[] dx= {-1,0,1,0};
private int[] dy= {0,-1,0,1};
class node {
int x,y,val;
public node(int x,int y,int val) {
this.x=x;
this.y=y;
this.val=val;
}
}
public int maxDistance(int[][] grid) {
int n=grid.length;
int[][] dis=new int[n][n];
Queue<node> q=new LinkedList<>();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dis[i][j]=mx;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(grid[i][j]==1) {
dis[i][j]=0;
q.add(new node(i,j,0));
}
while(!q.isEmpty()) {
node now=q.poll();
for(int i=0;i<4;i++) {
int x=now.x+dx[i];
int y=now.y+dy[i];
if(x<0 || x>=n || y<0 || y>=n)
continue;
if(dis[x][y]>now.val+1) {
dis[x][y]=now.val+1;
q.add(new node(x,y,dis[x][y]));
}
}
}
int ans=-1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(grid[i][j]==0)
ans=Math.max(ans, dis[i][j]);
return ans==mx?-1:ans;
}
}