JAVA广度优先搜索---寻找从A点到B点最短路径
前言
搜索界两大基础搜索算法分别是广度优先搜索和深度优先搜索。
搜索算法可以用于寻找图的连通性。
一个普通的二维地图,从A点到B点,有两个问题。
- 能否到达?
- 怎样以最短的路径走到B点?
这是搜索算法能够解决的事情。
要使用广度优先搜索算法来搜索从A点到B点的最短路径
依据广度优先的原则,每走一步,都将下一步所有可能的选择入队之后,才进行下一步
结束标记:
队列为空时,搜索结束
搜索到指定结果时,搜索结束
实现功能
在一个二维地图中
- 计算A点到B点的最少步数
- 输出最少步数的路径
中文版参考实现
** A* B C* D G E* F* 搜索从A到F的最少步数* 宽度优先搜索:* 第一步:* A入队,步数是0* A为队列头* 第二步:* 查看A下一步的所有选择* 有B和C,所以第二步可以到达B和C,步数是1* B、C入队,同时标记B和C,表示已经走过了。* A已经没用了,因为A所有可能到达的点已经在队列里了,所以A出队。* 判断是否达到目标地点,是,结束循环。当前步数是最短步数* 否则继续* 此时队列头为B* 第三步:* B、C是同时入队的,所以两个都要在第三步里扩展所有可能。** 1. 查看B下一步的所有选择* 有D、G* D、G入队,标记D、G* B也没用了,B出队* 判断是否达到目标地点,是,结束循环。当前步数是最短步数* 否则继续* 此时队列头为C* 2. 查看C下一步的所有选择* 有G、E,但是G已经标记走过了* 所以只有E可选* E入队,同时标记E* C已无效,C出队* 此时队列头为D* 合并B、C扩展出来的所有选择,有D、G、E* 所以第三步可以达到的是D、G、E,步数是2* 判断是否达到目标地点,是,结束循环。当前步数是最短步数* 否则继续* 第四步:* 搜索D、G、E所有的的扩展可能** 1. 查看D下一步的所有选择* 有F,F是目标,F入队,此时步数是3* D出队* 判断是否达到目标地点,是,结束循环。当前步数是最短步数* 发现F是目标,结束遍历。** A到达F的最小步数是3*/
代码实现
/*** 一个5行4列的地图* 其中部分地方有障碍无法通过* 找出从(1, 1)到(4, 3)的最少步数是多少* 输出路径*/
public class WalkingLabyrinth {static int maxLine = 6;static int maxRow = 5;static int[][] map = new int[maxLine][maxRow];static int[][] mark = new int[maxLine][maxRow];static int targetLine = 4;static int targetRow = 3;static int step = -1;static int[][] nextDirection = {{0, -1},{1, 0},{0, 1},{-1, 0}};public static void main(String[] args) {map[1][3] = 1;map[3][3] = 1;map[4][2] = 1;map[5][4] = 1;//堵住所有道路//map[4][4] = 1;//map[5][3] = 1;bfs(1, 1);System.out.print(step == -1 ? "\n没有到达" : "\n到达");System.out.println("目标位置: " + targetLine + "行" + targetRow + "列,步数:" + step);}public static void bfs(int startLine, int startRow) {mark[startLine][startRow] = 1;Node[] queue = new Node[maxLine * maxRow];int head = 0;int tail = 0;Node tNode = new Node(startLine, startRow, 0, head);queue[tail++] = tNode;int tLine, tRow;while (head < tail) {for (int i = 0; i < 4; i++) {tLine = queue[head].getLine() + nextDirection[i][0];tRow = queue[head].getRow() + nextDirection[i][1];if (tLine >= maxLine || tRow >= maxRow || tLine < 1 || tRow < 1) {continue;}if (mark[tLine][tRow] != 1 && map[tLine][tRow] != 1) {tNode = new Node(tRow, tLine, queue[head].getStep() + 1, head);queue[tail++] = tNode;//System.out.println("当前位置: " + tLine + "行" + tRow + "列,步数:" + queue[tail - 1].getStep());mark[tLine][tRow] = 1;}if (tLine == targetLine && tRow == targetRow) {step = queue[tail - 1].getStep();System.out.println("经过路径:");int index = tail - 1;for (int j = 0; j <= step; j++) {System.out.println("("+ queue[index].getLine() + "," + queue[index].getRow() +")");index = queue[index].getP();}return;}}head++;}step = -1;}private static class Node {int row, line, step;int p;public int getP() {return p;}Node(int line, int row) {this.line = line;this.row = row;}Node(int row, int line, int step, int p) {this.row = row;this.line = line;this.step = step;this.p = p;}public int getRow() {return row;}public int getLine() {return line;}public int getStep() {return step;}}
}
结果
经过路径:
(4,3)
(5,3)
(5,2)
(5,1)
(4,1)
(3,1)
(2,1)
(1,1)到达目标位置: 4行3列,步数:7
一点收获
原来简单模拟队列,可以简单到如此程度!!
一个数组,两个索引。
int index = tail - 1;for (int j = 0; j <= step; j++) {System.out.println("("+ queue[index].getLine() + "," + queue[index].getRow() +")");index = queue[index].getP();}
感觉我的这段代码充满了智慧恩,这是传说中的推倒(ノ*・ω・)ノ,好吧是倒推!
之前是看过的,过了不到三个月,再看跟新的一样。太久没用了,还是得日久才能熟悉。没事要瞄一眼代码留点印象。
END
JAVA广度优先搜索---寻找从A点到B点最短路径相关推荐
- 小白的算法初识课堂(part6)--广度优先搜索
学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 图简介 图是啥 广度优先搜索 寻找最短路径 队列 实现图 实现算法 运行时间 图简介 今天是五一,假如我要从家 ...
- Queue(队列)-Swift实现与广度优先搜索应用
定义 仅可以在队首进行删除,队尾进行插入的线性表,称为队列. 特点 先入队列,则先删除(First In First Out),类似Stack 应用 键盘的输入输出 广度优先搜索等算法的实现 Swif ...
- 算法十——深度优先搜索和广度优先搜索
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 搜索算法 算法是作用于数据结构之上的.深度优先搜索.广度优先搜索是作用于图这种数据结构之上的.图上的搜索 ...
- java广度优先算法,算法之广度优先搜索
一.引言 上一次介绍的算法是深度优先搜索 这次我们来研究一下广度优先搜索,看看怎么理解以及写出这个算法 这个算法需要数据结构的基础--队列,如果没有这个基础的同学去恶补一下. 二.小小问题 Q:在一个 ...
- 图的深度优先搜索和广度优先搜索(邻接表) - Java实现
文章目录 前言 1.什么是图? 2.图如何表示? 3.如何创建一个邻接表 一.深度优先搜索(Depth First Search) 二.广度优先搜索(Breadth First Search) 三.寻 ...
- 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...
度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...
- Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...
- 二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码
自古逢秋悲寂寥,我言秋日胜春朝 二叉树结构说明 本博客使用树节点结构,如下所示: Kotlin 版本 class TreeNode(var value: String, var leftNode: T ...
- Java实现广度优先搜索
Java实现广度优先搜索 基本思想 实现思路 代码实现 基本思想 从出发节点开始访问,然后去访问该节点的所有相邻节点,访问完该节点的所有相邻节点后,以相邻节点中的第一个节点为起点,继续去访问其所有相邻 ...
最新文章
- php 预订义变量,预约义变量 PHP
- 那些年,一起学的Java 7-3
- 【MySQL】在centos7 纯IPv6环境下,安装mysql5.7
- 2017第四季度移动行业数据报告
- react控制元素的显示或隐藏
- Java中值传递和引用传递原理以及区别
- Android开发之部分字符串可实现超链接点击事件的方法
- 标志寄存器:CF、PF、AF、ZF、SF、TF、DF、OF
- 设计模式--结构型模式
- 计算机网络知识点回顾
- 大学生慕课第二周学习笔记
- tomcat启动成功 未加载项目_智云CRM项目启动大会在深圳成功召开
- axios封装接口步骤详解
- 重庆大学c语言程序设计基础,c语言程序设计基础黄文胜
- Python url的编码转换
- SQL基础(一):安装MySQL以及一些简单操作
- LeetCode,无它,唯手熟尔(三)
- workman 日志_Workman手册笔记一
- 2020年微信怎么推刷脸支付
- Windows高效桌面壁纸