你现在手里有一份大小为 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。

提示:

1 <= grid.length == grid[0].length <= 100
grid[i][j] 不是 0 就是 1

第一想法:

从陆地出发,更新每个海洋距离陆地的值,超时。。。

int visited[100][100];
void chushihua(int **visited,int gridSize,int *gridColSize){for(int i=0;i<gridSize;i++){for(int j=0;j<(*gridColSize);j++){visited[i][j]=0;}}
}
int dfs(int **flag,int **grid,int gridSize,int* gridColSize,int currentX,int currentY,int targetX,int targetY){if(currentX>= gridSize || currentX<0 ||currentY >=(*gridColSize) || currentY<0 || visited[currentX][currentY]==1){return -1;}visited[currentX][currentY]=1;if(grid[currentX][currentY]==0){int len=abs(targetX-currentX)+abs(targetY-currentY);if(flag[currentX][currentY]>len){flag[currentX][currentY]=len;}}dfs(flag,grid,gridSize,gridColSize,currentX+1,currentY,targetX,targetY);dfs(flag,grid,gridSize,gridColSize,currentX-1,currentY,targetX,targetY);dfs(flag,grid,gridSize,gridColSize,currentX,currentY+1,targetX,targetY);dfs(flag,grid,gridSize,gridColSize,currentX+1,currentY-1,targetX,targetY);return ;
}
int maxDistance(int** grid, int gridSize, int* gridColSize){int **flag=(int**)malloc(sizeof(int*)*gridSize);//int **visited=(int**)malloc(sizeof(int*)*gridSize);for(int i=0;i<gridSize;i++){flag[i]=(int*)malloc(sizeof(int)*(*gridColSize));for(int j=0;j<(*gridColSize);j++){flag[i][j]=999;visited[i][j]=0;}}for(int i=0;i<gridSize;i++){for(int j=0;j<(*gridColSize);j++){if(grid[i][j]==1){//chushihua(visited,gridSize,gridColSize);memset(visited,0,sizeof(visited));dfs(flag,grid,gridSize,gridColSize,i,j,i,j);}}}int max=-1;for(int i=0;i<gridSize;i++){for(int j=0;j<(*gridColSize);j++){//printf("%d ",visited[i][j]);if(flag[i][j]!=999 && flag[i][j]>max){max=flag[i][j];}}}return max;
}

用例过了1/3左右

第二想法:

使用BFS从每个海洋出发,寻找每个海洋最近的距离,找出最大值;


int visited[100][100];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int findMax(int x,int y,int **grid,int gridSize,int *gridColSize){int queue[10000][2];int head=0;int tail=0;int distance=0;memset(visited,0,sizeof(visited));queue[tail][0]=x;queue[tail][1]=y;//visited[x][y]=1;tail++;int step=0;while(tail!=head){int tmp=tail-head;for(int i=0;i<tmp;i++){int currentx=queue[head][0];int currenty=queue[head][1];head++;if(visited[currentx][currenty]){continue;}visited[currentx][currenty]=1;// if(grid[currentx][currenty]){//     return step+1;// }for(int j=0;j<4;j++){int tx=currentx+dx[j];int ty=currenty+dy[j];if(tx>=0 && tx<gridSize && ty>=0 && ty<(*gridColSize) && visited[tx][ty]==0 && grid[tx][ty]==1){// queue[tail][0]=tx;// queue[tail][1]=ty;// tail++;return step+1;}if(tx>=0 && tx<gridSize && ty>=0 && ty<(*gridColSize) && visited[tx][ty]==0){queue[tail][0]=tx;queue[tail][1]=ty;tail++;}}}step++;}return -1;
}
int maxDistance(int** grid, int gridSize, int* gridColSize){int ans=-1;for(int i=0;i<gridSize;i++){for(int j=0;j<(*gridColSize);j++){if(!grid[i][j]){ans=fmax(ans,findMax(i,j,grid,gridSize,gridColSize));}}}return ans;}

第三想法:

使用Dijkstra算法,进行松紧筛,从每个陆地出发,找最近的海洋,设置边值

1162. 地图分析 BFS Dijkstra算法相关推荐

  1. dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

  2. 详解BFS,Dijkstra算法,Floyd算法是如何解决最短路径问题的

    目录 1.BFS算法 2.Dijkstra算法 3.Floyd算法 4.总结 1.BFS算法 G纲是个物流离散中心,经常需要往各个城市运东西,怎么运送距离最近--单源最短路径问题 各个城市之间也学要来 ...

  3. python基于广度优先(BFS)的迪杰斯特拉(Dijkstra)算法 求最短路径

    python深度优先与广度优先的遍历算法区别 首先要理解搜索步,一个完整的搜索步包括两个处理: a) 获得当前位置上,有几条路可供选择 b) 根据选择策略,选择其中一条路,并走到下个位置 广度优先:就 ...

  4. LeetCode - 1162 地图分析

    题目来源 1162. 地图分析 - 力扣(LeetCode) 题目描述 你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了.其中 0 代表海洋,1  ...

  5. [C] Dijkstra算法——通过边实现松弛

    Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...

  6. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  7. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  8. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

    上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...

  9. 最短路径的Dijkstra算法(邻接表)

    原文:http://blog.csdn.net/axiqia/article/details/50984464 描述 以邻接表作为存储结构实现,求解从给定源点到给定结束点的最短路径. 输入 从1开始表 ...

最新文章

  1. 写时复制,写时拷贝,写时分裂,Copy on write
  2. retain copy(浅复制) mutablecopy (深复制)
  3. 使用java多线程分批处理数据工具类
  4. 从 0 到 1 实现 React 系列 —— 4.setState优化和ref的实现
  5. sqoop——将mysql数据库的数据表导入到hdfs上
  6. js的array.some()方法
  7. Acwing 232. 守卫者的挑战
  8. auot lisp 选择集处理_离散量的计算机处理63_1Cv6
  9. java编写猫抓老鼠程序_Java抓鱼程序
  10. mediarecorder 录制的文件无法拖动进度条_如何下载网络ts视频文件
  11. 迭代器之输入和输出迭代器
  12. AutoX披露无人车云代驾系统:夜晚远程操控车队也easy
  13. maven私服搭建及应用
  14. Linux Mint 双系统安装教程
  15. java计算机毕业设计宠物店管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  16. 2022 数学建模B题 高教社杯 含半成品论文 部分代码 全部数学模型 和全套思路
  17. 【微信小程序系列】微信小程序超简单教程,基本语法,获取用户基本数据信息,实现对云数据库的增删改查及小程序外部api的引用示例(附源码)
  18. Java Socket详解+基础模板+各种常见问题+端口映射
  19. C语言之“拒绝scanf,从我做起”
  20. 中国联通客户端被曝Bug:无密码随便登陆

热门文章

  1. STM32F103控制异味传感器和温湿度传感器控制模块
  2. python爬虫tableau数据分析_完美!Python爬招聘数据,Tableau做可视化分析
  3. 心田花开:请重视情商教育的重要性!
  4. 学计算机的男孩情商高吗,2021情商高的男孩适合学什么专业
  5. 蓝桥杯2022砍竹子
  6. 网络安全之信息收集(二)
  7. 企名片数据加密javascript逆向实战
  8. python利用多线程批量下载高清美女图片(350秒下载近3600张1.2个G的照片,地址可变)
  9. 『重磅』2022年度高等教育中国学科评级结果发布
  10. left join 基本用法