题目:地图分析
你现在手里有一份大小为 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。
我的解答:
代码语言: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 ;
}