和01矩阵一样

先找所有的1是起点,再从每个1开始向内广度优先,直至遍历完全部节点

#include <stdc++.h>
using namespace std;
int line;
int raw;
int setPos(int x, int y) { return x * raw + y; }
int getLine(int pos) { return pos / raw; }
int getRaw(int pos) { return pos % raw; }int maxDistance(vector<vector<int>>& grid) {queue<int> bfs;line = static_cast<int>(grid.size());if (line != 0) raw = static_cast<int>(grid[0].size());for (int i = 0; i < line; ++i) {for (int j = 0; j < raw; ++j) {if (grid[i][j] == 1) bfs.push(setPos(i, j));}}int ret = INT_MIN;if (bfs.empty() || bfs.size() == grid.size() * grid.size()) return -1;while (!bfs.empty()) {int cur_pos = bfs.front();bfs.pop();int x = getLine(cur_pos), y = getRaw(cur_pos);ret = max(ret, grid[x][y]);if (x + 1 < line) {if (grid[x + 1][y] == 0) {grid[x + 1][y] = grid[x][y] + 1;bfs.push(setPos(x + 1, y));} else {grid[x + 1][y] = min(grid[x + 1][y], grid[x][y] + 1);}}if (x - 1 >= 0) {if (grid[x - 1][y] == 0) {grid[x - 1][y] = grid[x][y] + 1;bfs.push(setPos(x - 1, y));} else {grid[x - 1][y] = min(grid[x - 1][y], grid[x][y] + 1);}}if (y + 1 < raw) {if (grid[x][y + 1] == 0) {grid[x][y + 1] = grid[x][y] + 1;bfs.push(setPos(x, y + 1));} else {grid[x][y + 1] = min(grid[x][y + 1], grid[x][y] + 1);}}if (y - 1 >= 0) {if (grid[x][y - 1] == 0) {grid[x][y - 1] = grid[x][y] + 1;bfs.push(setPos(x, y - 1));} else {grid[x][y - 1] = min(grid[x][y - 1], grid[x][y] + 1);}}}return ret - 1;
}int main() {vector<vector<int>> a = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}};cout << maxDistance(a) << endl;;return 0;
}

1162. 地图分析相关推荐

  1. leetcode:1162. 地图分析

    题目来源 leetcode:1162. 地图分析 题目描述 题目解析 题目分析 本题要求:求所有海洋点到离它最近的陆地点的距离的最大值. 问题:什么是距离?这里是曼哈顿距离,就是只能沿着横.竖到达另外 ...

  2. LeetCode - 1162 地图分析

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

  3. LeetCode:1162. 地图分析+模板链接

    题目 LeetCode:1162. 地图分析 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地 ...

  4. LeetCode 1162. 地图分析(BFS)

    1. 题目 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域 ...

  5. 1162. 地图分析 BFS Dijkstra算法

    你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的 ...

  6. LeetCode 1162 地图分析

    题目: 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是 ...

  7. 365天挑战LeetCode1000题——Day 081 统计子串中的唯一字符 地图分析 太平洋大西洋水流问题

    828. 统计子串中的唯一字符 按贡献值,也就是每个字符可能在多少个字符串中出现来进行计算,大大降低了复杂度 代码实现(部分看题解) class Solution {public:int unique ...

  8. leetcode刷题:不同路径II

    分析: 我们用 f(i, j)f(i,j) 来表示从坐标 (0, 0)(0,0) 到坐标 (i, j)(i,j) 的路径总数,u(i, j)u(i,j) 表示坐标 (i, j)(i,j) 是否可行,如 ...

  9. 2019年9月Leetcode每日训练日志

    2019-09-16 #1171 从链表中删去总和值为零的连续节点 #1170 比较字符串最小字母出现频次 #1169 查询无效交易 #226 翻转二叉树 2019-09-15 #1190 反转每对括 ...

最新文章

  1. [Java基础] Java如何实现条件编译
  2. Java克隆(Clone)的应用
  3. ORM对mysql数据库中数据进行操作报错解决
  4. Java中List for循环的6种写法总结(推荐)(亲测)
  5. JS中遍历数组的两种方式
  6. Java 8最新消息
  7. 计算机计算exp函数原理,exp()函数的数值计算中的系数
  8. window和linux下Redis 安装和使用
  9. 用sql的select语句从数据库中获取数据
  10. 存储系统的实现-探析存储的机制和原理
  11. C语言:丹尼斯·里奇的不朽遗产
  12. RGB彩色空间和YIQ、灰度等的转化
  13. 浅学C#(3)——C#的优点和缺点
  14. 《鹰猎长空》讲述戏曲与电影的渊源
  15. 电网企业 财务管理创新
  16. IOS手机ssh连接linux好用工具
  17. VB.NET模拟LED数字钟
  18. 如何拍摄VR全景照片
  19. 字符编码:计算机的巴别塔
  20. Mac OS 如何升级到指定版本

热门文章

  1. JVM学习笔记0:Java虚拟机概述
  2. hp m429fdw 打印机关于 低功耗蓝牙的说明
  3. iphone6s 刷android,iPhone也能刷安卓,只限两款手机,国外大神骚操作
  4. 92. 你说你精通Java并发,那给我讲讲JUC吧
  5. 【C语言】运算符注意点
  6. 同一台机 TCP 和 UDP 能否使用同一个端口号?
  7. 强力推荐一个完善的物流管理系统
  8. 阿里巴巴之高段位程序员的学习之道
  9. 内衣品牌BODY JAZZ引领时尚潮流,喜提中文名
  10. 多维时序 | MATLAB实现TPA-LSTM(时间注意力注意力机制长短期记忆神经网络)多输入单输出