文章目录

  • 前言
  • 一、BFS算法的大致思路
  • 二、两个案例
    • 1.走迷宫
      • 1.1 问题描述
      • 1.2 实现代码
    • 2.八数码
      • 2.1 问题描述
      • 2.2 实现代码

前言

上篇有写到DFS算法的大致思路和一个应用案例。本篇主要介绍BFS算法(广度优先搜索)的思路和两个案例。


一、BFS算法的大致思路

BFS算法利用了数据结构中的队列,他的算法思想大体如下:

(1)A为最高层作为队列的队头,将其移出队列,并将相邻元素移入队列。

B C D F作为A的相邻队列进入队列
(1)将B移出队列,如果B有邻接点且未被访问过,将其依次压入队列
(2)将C移出队列,如果C有邻接点且未被访问过,将其依次压入队列
(3)将D移出队列,将其邻接点E压入队列


将D移出队列,将其邻接点H,G依次压入队列


对队列中剩余元素重复相同操作,直至所有元素都被访问过。

由此可见,DFS通俗来讲为“追查到底”,而BFS可以称为“逐层搜索”。

二、两个案例

1.走迷宫

1.1 问题描述

给定一个 n×mn×mn×m 的二维整数数组,用来表示一个迷宫,数组中只包含 000 或 111,其中 000 表示可以走的路,111 表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1)(1,1)(1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m)(n,m)(n,m) 处,至少需要移动多少次。

数据保证 (1,1)(1,1)(1,1) 处和 (n,m)(n,m)(n,m) 处的数字为 0,且一定至少存在一条通路。

1.2 实现代码

import java.io.*;
import java.util.*;class Main {private static int N = 110;private static int[][] q = new int[N][N];private static int[][] d = new int[N][N];public static void main(String[] args) throws IOException {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));String[] str1 = bufferedReader.readLine().split(" ");int n = Integer.parseInt(str1[0]);int m = Integer.parseInt(str1[1]);for (int i = 0; i < n; i ++) {String[] str2 = bufferedReader.readLine().split(" ");for (int j = 0; j < m; j ++) {q[i][j] = Integer.parseInt(str2[j]);}}System.out.println(bfs(n, m));bufferedReader.close();}public static int bfs(int n, int m) {Queue<int[]> queue = new LinkedList<>();d[0][0] = 0;///dx 和 dy表示上下左右四个方向int[] dx = {-1, 0, 1, 0}; int[] dy = {0, 1, 0, -1};queue.offer(new int[]{0, 0});while (!queue.isEmpty()) {int[] a = queue.poll();for (int i = 0; i < 4; i ++) {int x = a[0] + dx[i];int y = a[1] + dy[i];if (x >= 0 && x < n && y >= 0 && y < m && q[x][y] == 0 && d[x][y] == 0) {d[x][y] = d[a[0]][a[1]] + 1;queue.offer(new int[]{x, y});}}}return d[n - 1][m - 1];}
}

2.八数码

2.1 问题描述

在一个 3×33×33×3 的网格中,1∼81∼81∼8 这 888 个数字和一个 x 恰好不重不漏地分布在这 3×33×33×3 的网格中。

例如:

1 2 3
x 4 6
7 5 8

在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。

我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

1 2 3
4 5 6
7 8 x

例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。

交换过程如下:

1 2 3   1 2 3   1 2 3   1 2 3
x 4 6   4 x 6   4 5 6   4 5 6
7 5 8   7 5 8  7 x 8   7 8 x

现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。

2.2 实现代码

import java.io.*;
import java.util.*;class Main {public static void main(String[] args) throws IOException {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));String[] str = bufferedReader.readLine().split(" ");String start = "";for (int i = 0; i < str.length; i ++) {start += str[i];}String end = "12345678x";System.out.println(bfs(start, end));bufferedReader.close();}public static void swap(char[] a, int i, int j) {char tmp = a[i];a[i] = a[j];a[j] = tmp;}public static int bfs(String start, String end) {Map<String, Integer> map = new HashMap<>();Queue<String> queue = new LinkedList<>();queue.offer(start);map.put(start, 0);int[] dx = {-1, 0, 1, 0};int[] dy = {0, 1, 0, -1};while (!queue.isEmpty()) {String s = queue.poll();if (s.equals(end)) {return map.get(s);}// k的位置int k = s.indexOf('x');int x = k / 3;int y = k % 3;for (int i = 0; i < 4; i ++) {int a = x + dx[i];int b = y + dy[i];if (a < 3 && a >= 0 && b < 3 && b >= 0) {char[] arr = s.toCharArray();swap(arr, k, a * 3 + b);String str = new String(arr);if (map.get(str) == null) {queue.offer(str);map.put(str, map.get(s) + 1);}}}}return -1;}
}

[Java学习] BFS算法示例相关推荐

  1. [Java学习] DFS算法示例

    文章目录 前言 一.DFS算法大致思路 二.一个示例问题 1.问题表述 2.实现代码 前言 遍历一个树或者图的过程中,DFS(深度优先搜索)是比较常用的一个算法.这次记录一下DFS算法的大致思路和一个 ...

  2. 通过网页查看服务器算法,java分析html算法(java网页蜘蛛算法示例)

    遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费我们宝贵的时间. 第二个办法用开源组织htmlparser的包 ...

  3. Java学习--排序算法之插入法排序

    算法策略:按顺序读入数组内的元素,从后往前的与已有元素比较大小,插入到前一位比自己小并且后一位比自己小的位置. 数据结构:常量.变量和数组: 控制结构:顺序结构.有界循环结构和条件循环结构. 算法流程 ...

  4. Java学习笔记 算法 Algorithms Fourth Edition

    标字符 字符串 字符 1.数字不能作为标识符的首字母 2.标识符不能有空格 3.严格区分大小写 4.不能是关键字. 5.标识符最好能反映其作用 6.下划线开头是可以的,数字开头是不行的 7.Void ...

  5. 分享优质JAVA学习网站

    分享优质JAVA学习网站 算法 Hello Algorithm Fucking Algorithm 图解计算机网络和操作系统(mysql.redis) 优质博主学习Java(公众号) 项目 总结 近期 ...

  6. Java数据结构与算法学习 目前30170字

    文章借鉴于[尚硅谷]数据结构与算法(Java数据结构与算法),在内容方面会做更改,但是核心依然是他们的学习视频.在这里声明. 1. 线性结构和非线性结构 1.1 线性结构 数据结构包括两大部分,一个叫 ...

  7. 机器学习知识点(十六)集成学习AdaBoost算法Java实现

    理解http://blog.csdn.net/fjssharpsword/article/details/61913092中AdaBoost算法,从网上找了一套简单的代码加以理解. 1.基分类器,实现 ...

  8. java 求交集 算法_Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例 发布时间:2020-10-07 10:37:46 来源:脚本之家 阅读:106 作者:benbenkui 本文实例讲述了Java计算交集,差集,并集的方法.分享 ...

  9. Java学习 第三章 数组(三)排序算法

    ** Java学习 第三章 数组(三)排序算法 ** 主要内容:排序算法.排序算法横向比较.Arrays工具类的使用.数组常见异常 1.数组中涉及到的常见算法:排序算法 1.1 排序算法分类:内部排序 ...

  10. QT学习笔记(十):通用算法示例

    QT学习笔记(十):通用算法示例 std是C++标准库统一使用的命名空间(namespace)的名称,C++标准库中的名字全部都在std这个命名空间中,std也就是英文"standard&q ...

最新文章

  1. 大数据引擎启动时常见错误汇总
  2. python3 字符串前面加上'r'的作用
  3. 一个基于.Net 5开发的轻量级Quartz配置中心 - QuartzCore.Blazor
  4. Linux系统下,MySQL以及禅道的安装/卸载
  5. window计算的chk在linux下可以读,Linux系统命令从入门到完全忘记(四)
  6. IIoT 安防保卫战一触即发,Fortinet 亮剑
  7. java ssh优势_java框架组合ssm和ssh各自的优势是什么?
  8. 《Python数据分析常用手册》NumPy和Pandas
  9. redis有序集合sorted set详解
  10. Prometheus+Grafana PG监控部署以及自定义监控指标
  11. linux进程理解,进程资源 - 进程基础 - [ 理解Linux进程 ] - 手册网
  12. Bailian2677 Bailian3865 肿瘤检测【基础】
  13. 矩阵微分(matrix derivatives)
  14. 535. Encode and Decode TinyURL - LeetCode
  15. php tp框架教程,从零开始了解thinkphp框架,tp框架基础教程
  16. 学习《华为基本法》(7):利益分配
  17. 斗地主系列之牌型大小比较
  18. 【转】PV3D的小练习~太阳系八大行星
  19. 阿兹卡班(azikaban)报错:syntax error:unexpected end of file
  20. angular directive详解

热门文章

  1. 远程teamviewer|远程工具teamviewer|远程控制软件teamviewer
  2. mmsi是代表船舶什么_海上移动业务识别码(MMSI)是一种九位识别码,主要分配给()在DSC和NBDP通信中相互识别身份是使用。...
  3. PingTunnel隧道搭建
  4. 电子电路基础 (11)——反馈、偏置与多级放大电路原理分析
  5. html drag 例子,html drag拖拽事件
  6. Android电话本实现
  7. java企业员工健康体检预约系统 python/php小程序 医院体检预约系统
  8. oracle普通索引改唯一索引,Oracle唯一索引功能替代
  9. 20135202闫佳歆-期中总结
  10. java计算机毕业设计高考填报信息系统源码+数据库+系统+lw文档+部署