当前位置: 代码迷 >> 综合 >> LeetCode题组:第1162题-地图分析
  详细解决方案

LeetCode题组:第1162题-地图分析

热度:74   发布时间:2023-12-14 08:44:52.0

题目:地图分析
你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 01标记好了。其中 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。


我的解答:

//定义陆地的结构体
typedef struct{
    int x;int y;int level;
}land;int maxDistance(int** grid, int gridSize, int* gridColSize){
    int line=gridSize, col=gridColSize[0];land *queue=(land*)malloc(sizeof(land)*line*col);//定义搜索的四个方向int move[4][2]={
    {
    -1,0},{
    0,1},{
    1,0},{
    0,-1}};int front=0, rear=0, flag=0;int tx,ty,tl,xx,yy;//将所有的陆地放入队列(queue)中for(int i=0;i<line;i++)for(int j=0;j<col;j++)if(grid[i][j]==1){
    queue[rear].x=i;queue[rear].y=j;queue[rear++].level=0;}while(front!=rear){
    tx=queue[front].x;ty=queue[front].y;//tl表示当前陆地与海洋最远的距离tl=queue[front++].level;//对陆地(queue[front])的四个方向进行搜索for(int i=0;i<4;i++){
    xx=tx + move[i][0];yy=ty + move[i][1];if(xx<0||xx>=line||yy<0||yy>=col)continue;if(grid[xx][yy]==0){
    //flag==1表示海洋与陆地同时存在flag=1;//将值设置为2表示已经遍历grid[xx][yy]=2;//将遍历后的海洋也纳入列表当中queue[rear].x=xx;queue[rear].y=yy;queue[rear++].level=tl+1;}}}return flag==1?tl:-1 ;
}