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

题目:地图分析
你现在手里有一份大小为 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 ;
}

猜你喜欢

转载自blog.csdn.net/qq_38251616/article/details/105176260