[Java学习] BFS算法示例
文章目录
- 前言
- 一、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算法示例相关推荐
- [Java学习] DFS算法示例
文章目录 前言 一.DFS算法大致思路 二.一个示例问题 1.问题表述 2.实现代码 前言 遍历一个树或者图的过程中,DFS(深度优先搜索)是比较常用的一个算法.这次记录一下DFS算法的大致思路和一个 ...
- 通过网页查看服务器算法,java分析html算法(java网页蜘蛛算法示例)
遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费我们宝贵的时间. 第二个办法用开源组织htmlparser的包 ...
- Java学习--排序算法之插入法排序
算法策略:按顺序读入数组内的元素,从后往前的与已有元素比较大小,插入到前一位比自己小并且后一位比自己小的位置. 数据结构:常量.变量和数组: 控制结构:顺序结构.有界循环结构和条件循环结构. 算法流程 ...
- Java学习笔记 算法 Algorithms Fourth Edition
标字符 字符串 字符 1.数字不能作为标识符的首字母 2.标识符不能有空格 3.严格区分大小写 4.不能是关键字. 5.标识符最好能反映其作用 6.下划线开头是可以的,数字开头是不行的 7.Void ...
- 分享优质JAVA学习网站
分享优质JAVA学习网站 算法 Hello Algorithm Fucking Algorithm 图解计算机网络和操作系统(mysql.redis) 优质博主学习Java(公众号) 项目 总结 近期 ...
- Java数据结构与算法学习 目前30170字
文章借鉴于[尚硅谷]数据结构与算法(Java数据结构与算法),在内容方面会做更改,但是核心依然是他们的学习视频.在这里声明. 1. 线性结构和非线性结构 1.1 线性结构 数据结构包括两大部分,一个叫 ...
- 机器学习知识点(十六)集成学习AdaBoost算法Java实现
理解http://blog.csdn.net/fjssharpsword/article/details/61913092中AdaBoost算法,从网上找了一套简单的代码加以理解. 1.基分类器,实现 ...
- java 求交集 算法_Java计算交集,差集,并集的方法示例
Java计算交集,差集,并集的方法示例 发布时间:2020-10-07 10:37:46 来源:脚本之家 阅读:106 作者:benbenkui 本文实例讲述了Java计算交集,差集,并集的方法.分享 ...
- Java学习 第三章 数组(三)排序算法
** Java学习 第三章 数组(三)排序算法 ** 主要内容:排序算法.排序算法横向比较.Arrays工具类的使用.数组常见异常 1.数组中涉及到的常见算法:排序算法 1.1 排序算法分类:内部排序 ...
- QT学习笔记(十):通用算法示例
QT学习笔记(十):通用算法示例 std是C++标准库统一使用的命名空间(namespace)的名称,C++标准库中的名字全部都在std这个命名空间中,std也就是英文"standard&q ...
最新文章
- 大数据引擎启动时常见错误汇总
- python3 字符串前面加上'r'的作用
- 一个基于.Net 5开发的轻量级Quartz配置中心 - QuartzCore.Blazor
- Linux系统下,MySQL以及禅道的安装/卸载
- window计算的chk在linux下可以读,Linux系统命令从入门到完全忘记(四)
- IIoT 安防保卫战一触即发,Fortinet 亮剑
- java ssh优势_java框架组合ssm和ssh各自的优势是什么?
- 《Python数据分析常用手册》NumPy和Pandas
- redis有序集合sorted set详解
- Prometheus+Grafana PG监控部署以及自定义监控指标
- linux进程理解,进程资源 - 进程基础 - [ 理解Linux进程 ] - 手册网
- Bailian2677 Bailian3865 肿瘤检测【基础】
- 矩阵微分(matrix derivatives)
- 535. Encode and Decode TinyURL - LeetCode
- php tp框架教程,从零开始了解thinkphp框架,tp框架基础教程
- 学习《华为基本法》(7):利益分配
- 斗地主系列之牌型大小比较
- 【转】PV3D的小练习~太阳系八大行星
- 阿兹卡班(azikaban)报错:syntax error:unexpected end of file
- angular directive详解
热门文章
- 远程teamviewer|远程工具teamviewer|远程控制软件teamviewer
- mmsi是代表船舶什么_海上移动业务识别码(MMSI)是一种九位识别码,主要分配给()在DSC和NBDP通信中相互识别身份是使用。...
- PingTunnel隧道搭建
- 电子电路基础 (11)——反馈、偏置与多级放大电路原理分析
- html drag 例子,html drag拖拽事件
- Android电话本实现
- java企业员工健康体检预约系统 python/php小程序 医院体检预约系统
- oracle普通索引改唯一索引,Oracle唯一索引功能替代
- 20135202闫佳歆-期中总结
- java计算机毕业设计高考填报信息系统源码+数据库+系统+lw文档+部署