BFS-走迷宫问题-java

2024-05-13 2122阅读

BFS叫做广度优先搜索算法,通过BFS来实现一个走迷宫问题。

文章目录

前言

一、BFS是什么?

1.BFS定义

2.BFS模拟实现 

二、走迷宫问题

1.问题描述

2.算法思路

三、代码

1.代码如下:

2.读入数据

3.代码运行结果

总结


前言

BFS叫做广度优先搜索算法,我们通过BFS来实现一个走迷宫问题。

一、BFS是什么?

1.BFS定义

BFS(又称广度优先搜索或者宽度优先搜索)是最简便的图的搜索算法之一。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了深度游优先搜索类似的思想。它是尽可能的找到与当前结点连接的所有结点,按照层级进行搜索,使用队列来维持待访问结点的顺序。

2.BFS模拟实现 

BFS-走迷宫问题-java 第1张

图 2.1树

我们还是通过图2.1的树来模拟一下BFS的整个流程,具体流程如下:

1->2->3->4->5->6->7->8->9->10

相同颜色的结点是一层的,所以BFS的特点就是我们把这一层的结点全部搜索完毕后才会去搜索下一层的结点。

通常我们是通过队列来模拟宽度优先搜索:

  1. 我们创建一个队列。
  2. 将根结点入队。
  3. 判断队列是否为空,不为空时,队列弹出一个结点,然后将它的左结点和右节点入队,重复上述操作,直到队列为空时退出循环。

二、走迷宫问题

1.问题描述

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

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

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

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

2.算法思路

我们以一个样例为基础来进行描述,输入数据如下:

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

正常情况下我们可以这样走

BFS-走迷宫问题-java 第2张

 图2.1路径图

 如果我们采用BFS,路径如下:

BFS-走迷宫问题-java 第3张

图2.2模拟路径 

我们引入二维数组map用来记录迷宫地图,二维数组d表示走到从起点走到当前结点所需要的步数。我们引入一个外部类Pair,用来表示当前结点是从哪一个坐标移动过来的,同时用一个二维数组prev来存储我们的路径。

bfs实现如下:

    public static int bfs(){
        //初始化队列
        Queue q = new LinkedList();
        int[] dy = {0,1,0,-1};
        int[] dx = {-1,0,1,0};
        q.add(new Pair(0,0));
        while (!q.isEmpty()){
            Pair pair = q.poll();
            if(pair.x == n-1 && pair.y == m-1){
                break;
            }
            //上下左右遍历
            for(int i = 0;i = 0 && x = 0 && y  

三、代码

1.代码如下:

package AcWing;
import java.io.*;
import java.util.*;
public class BFS走迷宫 {
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static int n,m;
    //用来记录路径长度
    static int[][] d = null;
    //用于记录当前位置是从哪个位置过来的
    static Pair[][] prev = null;
    //地图
    static int[][] map = null;
    public static void main(String[] args) {
        Scanner sc = new Scanner(br);
        n = sc.nextInt();
        m = sc.nextInt();
        map = new int[n][m];
        d = new int[n][m];
        prev = new Pair[n][m];
        for(int i = 0; i= 0 && x = 0 && y  

2.读入数据

代码如下(示例):

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

3.代码运行结果

最短路径:
4 4
3 4
2 4
2 3
2 2
2 1
2 0
1 0
最短步数:
8

总结

走迷宫跟bfs的基本思路一样,其中只不过是增加了走的方向和限制条件,只要理解了bfs的基本思路,那么走迷宫问题很容易得到解决。


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]