博客
关于我
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中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>