博客
关于我
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/

你可能感兴趣的文章
mariadb multi-source replication(mariadb多主复制)
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS UC 2013-0-Prepare Tool
查看>>
msbuild发布web应用程序
查看>>
MSB与LSB
查看>>
MSCRM调用外部JS文件
查看>>