题目:地图分析
你现在手里有一份大小为 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。
我的解答:
//定义陆地的结构体
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 ;
}