在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。

一条从左上角到右下角、长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, …, C_k 组成:

相邻单元格 C_i 和 C_{i+1} 在八个方向之一上连通(此时,C_i 和 C_{i+1} 不同且共享边或角)
C_1 位于 (0, 0)(即,值为 grid[0][0])
C_k 位于 (N-1, N-1)(即,值为 grid[N-1][N-1])
如果 C_i 位于 (r, c),则 grid[r][c] 为空(即,grid[r][c] == 0)
返回这条从左上角到右下角的最短畅通路径的长度。如果不存在这样的路径,返回 -1 。

示例 1:

输入:[[0,1],[1,0]]

输出:2

示例 2:

输入:[[0,0,0],[1,1,0],[1,1,0]]

输出:4

提示:

1 <= grid.length == grid[0].length <= 100
grid[i][j] 为 0 或 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-path-in-binary-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

看到这道题,我第一印象就是bfs。
然后写了半天发现俺不会:
又研究了下原理

void BFS()
{定义队列;定义备忘录,用于记录已经访问的位置;判断边界条件,是否能直接返回结果的。将起始位置加入到队列中,同时更新备忘录。while (队列不为空) {获取当前队列中的元素个数。for (元素个数) {取出一个位置节点。判断是否到达终点位置。获取它对应的下一个所有的节点。条件判断,过滤掉不符合条件的位置。新位置重新加入队列。}}}
代码
struct Node {int x;int y;
};
class Solution {public:int shortestPathBinaryMatrix(vector<vector<int>>& grid) {int ans = 0;queue<Node> myQ; // BFS一般通过队列方式解决int M = grid.size();int N = grid[0].size();// 先判断边界条件,很明显,这两种情况下都是不能到达终点的。if (grid[0][0] == 1 || grid[M - 1][N - 1] == 1) {return -1;}// 备忘录,记录已经走过的节点vector<vector<int>> mem(M, vector<int>(N, 0));myQ.push({0, 0});mem[0][0] = 1;// 以下是标准BFS的写法while (!myQ.empty()) {int size = myQ.size();for (int i = 0; i < size; i++) {Node currentNode = myQ.front();int x = currentNode.x;int y = currentNode.y;// 判断是否满足退出的条件if (x == (N - 1) && y == (M - 1)) {return (ans + 1);}// 下一个节点所有可能情况vector<Node> nextNodes = {{x + 1, y}, {x - 1, y}, {x + 1, y - 1}, {x + 1, y + 1},{x, y + 1}, {x, y - 1}, {x - 1, y - 1}, {x - 1, y + 1}};for (auto& n : nextNodes) {// 过滤条件1: 边界检查if (n.x < 0 || n.x >= N || n.y < 0 || n.y >= M) {continue;}// 过滤条件2:备忘录检查if (mem[n.y][n.x] == 1) {continue;}// 过滤条件3:题目中的要求if (grid[n.y][n.x] == 1) {continue;}// 通过过滤筛选,加入队列!mem[n.y][n.x] = 1;myQ.push(n);}               myQ.pop();}ans++;}return -1;        }
};作者:hank-36
链接:https://leetcode-cn.com/problems/shortest-path-in-binary-matrix/solution/biao-zhun-de-bfsjie-fa-duo-lian-xi-jiu-hui-zhang-w/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其实写着写着也不太会,看了半天例子,主要是总循环判断队列是不是空,队列不是空就把队列里的一个个拿出来,然后把队列周围一步可以加的数加进去,我那个三个判断条件没找好,备忘录是一定需要定义的。

struct Node{int x;int y;
};
class Solution {public:int shortestPathBinaryMatrix(vector<vector<int>>& grid) {//开始准备阶段,定义各种参数int count = 0;//计数int n = grid.size();int m = grid[0].size();//定义数组//开始判定条件if((grid[0][0]==1)|| (grid[m-1][n-1] ==1)) return -1;//备忘录vector<vector<int>> already(m, vector<int>(n, 0));//创建一个vector,里面装了m个vector<int>,vector<int>又装了N个0//开始模拟第一步,定义BFS的队列,进入矩阵queue<Node> myQ; // BFS一般通过队列方式解决myQ.push({0, 0});already[0][0] = 1;//表示已经遍历count++;while(!myQ.empty()){int size = myQ.size();for (int i = 0; i < size; i++) {Node data = myQ.front();//拿到队列第一个值int x = data.x;int y = data.y;if((x==n-1) && (y==m-1)) return count;//下一步的情况vector<Node> next = {{x + 1, y}, {x - 1, y}, {x + 1, y - 1}, {x + 1, y + 1},{x, y + 1}, {x, y - 1}, {x - 1, y - 1}, {x - 1, y + 1}};for (auto& n1 : next){// 过滤条件1: 如果边界超出就不能走if (n1.x < 0 || n1.x >= n || n1.y < 0 || n1.y >= m) {continue;}// 过滤条件2:如果走过就不能走if (already[n1.y][n1.x] == 1) {continue;}// 过滤条件3:如果有阻拦就不能走if (grid[n1.y][n1.x] == 1) {continue;}already[n1.y][n1.x] = 1;myQ.push(n1);}myQ.pop();}count++;}return -1;  }
};

和官方答案差不多嘿嘿。

学习总结:BFS的使用,vector的vector(m,n)就是数据n有m个。

C++算法学习(力扣:1091. 二进制矩阵中的最短路径)相关推荐

  1. leetcode -- 1091. 二进制矩阵中的最短路径

    在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k 组成: 相 ...

  2. LeetCode 1091. 二进制矩阵中的最短路径(BFS)

    1. 题目 在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径, 由满足下述条件的单元格 C_1, C_2, ..., C_ ...

  3. LeetCode 1091 二进制矩阵中的最短路径问题[BFS 队列] HERODING的LeetCode之路

    解题思路: 使用广度优先遍历的方法,可以遍历下一步能走的位置,一般用到广度优先就离不开队列,队列存储着当前轮次能够走的位置,每一轮都要将能走的长度++,如果队列无元素,说明无处可走,此时没有到终点就直 ...

  4. LeetCode #1091 二进制矩阵中的最短路径

    题目描述 在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k ...

  5. Leetcode1091_二进制矩阵中的最短路径(Java+BFS解法)

    Leetcode1091题:二进制矩阵中的最短路径(Java+BFS解法) 文章目录 Leetcode1091题:二进制矩阵中的最短路径(Java+BFS解法) 1.题目链接 2.解题思想 3.Jav ...

  6. C++算法学习(力扣:面试题 16.04. 井字游戏)

    设计一个算法,判断玩家是否赢了井字游戏.输入是一个 N x N 的数组棋盘,由字符" ","X"和"O"组成,其中字符" &quo ...

  7. C++算法学习(力扣:328. 奇偶链表)

    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1),时 ...

  8. C++算法学习(力扣:1254. 统计封闭岛屿的数目)

    有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 ). 我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」 ...

  9. C++算法学习(力扣:201. 数字范围按位与)

    给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入: [5,7] 输出: 4 ...

最新文章

  1. 语义SLAM近5年主要技术进展及研究趋势
  2. java solr 查询条件_05 java调用solr的api完成数据的查询
  3. python ssh2 库 远程登录 执行命令 文件获取
  4. 计算机网络与影视多媒体技术 南京理工大学,计算机网络多媒体数学库和课件结构设计-计算机仿真论文-计算机论文(8页)-原创力文档...
  5. 使用DOM4J解析XML时非法字符Exception
  6. 求合体电脑版_网红界宋祖儿找年轻版言承旭当男友,一张合照收割大量cp粉?!...
  7. 交叉编译工具链的使用
  8. 力软敏捷开发框架源码7.0.6旗舰版 JNPF开发平台3.3.3 3.4.1企业版/旗舰版框架
  9. The Django Book(一)
  10. 使用COMSOL提取指定时刻固体火箭发动机内的流体域(观点)
  11. 【学习笔记】Python办公自动化 - Task 01 文件自动化处理 邮件自动发送
  12. 一文详解 Android热修复实现原理
  13. 手机邮件html样式,iPhone技巧篇 如何添加HTML风格邮件签名
  14. Windows下MongoDB数据库基本使用
  15. 骨传导耳机的缺点有哪些?骨传导耳机的优缺点分析
  16. Java基于ssm开发的古董竞标拍卖系统也可以改成拍卖品网站
  17. 阿里云云计算专业认证考试(ACP级)
  18. 网络基础——牛客网刷题第五波
  19. Word2Vec教程 - Skip-Gram模型
  20. Pyhton dict 中文无法做key的问题

热门文章

  1. 通过VS2010性能分析来查找代码中那些地方最损耗资源
  2. B树、B-树、B+树、B*树都是什么
  3. JBPM 3.3.0 + JBOSS 4.2.3 + ORACLE 9i
  4. Leetcode 58 之反向迭代器的使用
  5. Git for Windows之分支管理、分支合并、解决分支冲突
  6. ERROR: ld.so: object '/usr/lib64/libtcmalloc.so.4' from LD_PRELOAD cannot be preloaded: ignored
  7. .JQuery中的Ajax
  8. [日常训练]training
  9. OC中数据库操作(类方法)
  10. Android自定义GridView显示一行,并且可以左右滑动