博客
关于我
LeetCode--(BFS)二进制矩阵中的最短路径
阅读量:164 次
发布时间:2019-02-28

本文共 1959 字,大约阅读时间需要 6 分钟。

文章目录

算法思想

深度搜索和广度搜索广泛应用于树和图中。

BFS一层一层的进行遍历,每层遍历都是以上一层的结果作为起点,遍历一个距离能访问到的所有节点,需要注意的是,遍历过的节点不能再次被遍历。
每一层遍历的节点都与根节点距离相同。设di表示第i个节点与根节点的距离,推导出一个结论:对于先遍历的节点i与后遍历的节点j,有di<dj。利用这个结论,可以求解最短路径等最优解问题:第一次遍历到的目的节点,其所经过的路径为最短路径。
使用BFS只能求解无权图的最短路径,无权图是指从一个节点到另一个节点的代价都记为1。
在程序实现BFS时需要考虑以下的问题:

  • 队列:用来存储每一轮遍历得到的节点
  • 标记:对于遍历过的节点,应该将它标记,防止重复遍历。

题目

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

题目大意

给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。

二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:
路径途经的所有单元格都的值都是 0 。
路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。
畅通路径的长度 是该路径途经的单元格总数。
在这里插入图片描述

解题思路

利用一个变量pathlength来计步,利用while(size-->0)来控制每一层的遍历,只有遍历完一层节点节点之后pathlength才进行加1,跳出该层循环的时候才会判断队列中有多少元素。第一次到达(m,n)坐标就返回,即对应最短路径。

代码实现

class Solution {    public int shortestPathBinaryMatrix(int[][] grid) {        //8个方向的BFS问题        if(grid==null||grid.length==0||grid[0].length==0){            return -1;        }        int[][] direction={  {-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};        int m=grid.length,n=grid[0].length;        Queue
> queue=new LinkedList<>(); queue.add(new Pair<>(0,0)); int pathlength=0; while(!queue.isEmpty()){ int size=queue.size(); pathlength++; //开始进入每一层相邻节点 while(size-->0){ Pair
cur=queue.poll(); int cr=cur.getKey(); int cc=cur.getValue(); if(grid[cr][cc]==1){ continue; } //到达终点 if(cr==m-1&&cc==n-1){ return pathlength; } //标记走过的节点 grid[cr][cc]=1; for(int[] d:direction){ int nr=cr+d[0],nc=cc+d[1]; if(nr<0||nr>=m||nc<0||nc>=n){ continue; } queue.add(new Pair<>(nr,nc)); } } } return -1; }}

转载地址:http://lpwc.baihongyu.com/

你可能感兴趣的文章
MySQL 常见的开放性问题
查看>>
Mysql 常见错误
查看>>
mysql 常见问题
查看>>
MYSQL 幻读(Phantom Problem)不可重复读
查看>>
mysql 往字段后面加字符串
查看>>
mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
查看>>
MySQL 快速创建千万级测试数据
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
MySql 手动执行主从备份
查看>>
Mysql 批量修改四种方式效率对比(一)
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>