前言

搜索界两大基础搜索算法分别是广度优先搜索和深度优先搜索。

搜索算法可以用于寻找图的连通性。
一个普通的二维地图,从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点最短路径相关推荐

  1. 小白的算法初识课堂(part6)--广度优先搜索

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 图简介 图是啥 广度优先搜索 寻找最短路径 队列 实现图 实现算法 运行时间 图简介 今天是五一,假如我要从家 ...

  2. Queue(队列)-Swift实现与广度优先搜索应用

    定义 仅可以在队首进行删除,队尾进行插入的线性表,称为队列. 特点 先入队列,则先删除(First In First Out),类似Stack 应用 键盘的输入输出 广度优先搜索等算法的实现 Swif ...

  3. 算法十——深度优先搜索和广度优先搜索

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 搜索算法 算法是作用于数据结构之上的.深度优先搜索.广度优先搜索是作用于图这种数据结构之上的.图上的搜索 ...

  4. java广度优先算法,算法之广度优先搜索

    一.引言 上一次介绍的算法是深度优先搜索 这次我们来研究一下广度优先搜索,看看怎么理解以及写出这个算法 这个算法需要数据结构的基础--队列,如果没有这个基础的同学去恶补一下. 二.小小问题 Q:在一个 ...

  5. 图的深度优先搜索和广度优先搜索(邻接表) - Java实现

    文章目录 前言 1.什么是图? 2.图如何表示? 3.如何创建一个邻接表 一.深度优先搜索(Depth First Search) 二.广度优先搜索(Breadth First Search) 三.寻 ...

  6. 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

    度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...

  7. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  8. 二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码

    自古逢秋悲寂寥,我言秋日胜春朝 二叉树结构说明 本博客使用树节点结构,如下所示: Kotlin 版本 class TreeNode(var value: String, var leftNode: T ...

  9. Java实现广度优先搜索

    Java实现广度优先搜索 基本思想 实现思路 代码实现 基本思想 从出发节点开始访问,然后去访问该节点的所有相邻节点,访问完该节点的所有相邻节点后,以相邻节点中的第一个节点为起点,继续去访问其所有相邻 ...

最新文章

  1. php 预订义变量,预约义变量 PHP
  2. 那些年,一起学的Java 7-3
  3. 【MySQL】在centos7 纯IPv6环境下,安装mysql5.7
  4. 2017第四季度移动行业数据报告
  5. react控制元素的显示或隐藏
  6. Java中值传递和引用传递原理以及区别
  7. Android开发之部分字符串可实现超链接点击事件的方法
  8. 标志寄存器:CF、PF、AF、ZF、SF、TF、DF、OF
  9. 设计模式--结构型模式
  10. 计算机网络知识点回顾
  11. 大学生慕课第二周学习笔记
  12. tomcat启动成功 未加载项目_智云CRM项目启动大会在深圳成功召开
  13. axios封装接口步骤详解
  14. 重庆大学c语言程序设计基础,c语言程序设计基础黄文胜
  15. Python url的编码转换
  16. SQL基础(一):安装MySQL以及一些简单操作
  17. LeetCode,无它,唯手熟尔(三)
  18. workman 日志_Workman手册笔记一
  19. 2020年微信怎么推刷脸支付
  20. Windows高效桌面壁纸

热门文章

  1. 学前儿童社会教育 渝粤题库整理
  2. 东北大学计算机学院杨金柱院长,电子信息学院赴东北大学走访、调研
  3. 小米mini版青春版智能无线路由器相关记录
  4. 小武学fpgastep5
  5. 小程序源码《表情包多样版》
  6. TikTok跨境电商:TikTok代开英国小店、印尼小店,美国小黄车,广告账户
  7. winnt.h的错误解决办法
  8. cad绘制正八边形_什么是CAD?为什么要学CAD?该怎么学CAD?
  9. Windows系统win10系统流程图软件推荐
  10. 在html页头设置不缓存