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

2020-03-31 10:37:46 浏览数 (1)

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


我的解答:

代码语言:javascript复制
//定义陆地的结构体
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 ;
} 

0 人点赞