BFS广度优先遍历——Acwing 844. 走迷宫

news2024/10/2 3:34:55

1.BFS简介

我们可以将bfs当做一个成熟稳重的人,一个眼观六路耳听八方的人,他每次搜索都是一层层的搜索,从第一层扩散到最后一层,BFS可以用来解决最短路问题。

2.基本思想

从初始状态S开始,利用规则,生成所有可能的状态。构成树的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则。生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。

3.Acwing 844. 走迷宫

3.1题目

https://www.acwing.com/problem/content/846/

3.2bfs 过程手动模拟:

从起点开始,往前走第一步,记录下所有第一步能走到的点,然后从所第一步能走到的点开始,往前走第二步,记录下所有第二步能走到的点,重复下去,直到走到终点。输出步数即可。

3.3Ac代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;


public class Main{

    static int n,m,N=110;
    static int [][]p=new int[N][N];     //存储原始地图
    static boolean [][]state=new boolean[N][N];  //每个点是否走过
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String []s=br.readLine().split(" ");
        n=Integer.parseInt(s[0]);
        m=Integer.parseInt(s[1]);
        for (int i = 1; i <=n; i++) {
            s=br.readLine().split(" ");
            for (int j =1; j <=m; j++) {
                p[i][j]=Integer.parseInt(s[j-1]);
            }
        }
        bfs();
        br.close();
    }

    private static void bfs() {
        int x=1,y=1;
        Queue<Point> q=new ArrayDeque<>();  //创建队列存储走过的每一个点
        q.add(new Point(x,y,0));      //首先把第一个点存进队列
        int []dy={0,-1,0,1};
        int []dx={-1,0,1,0};
        while (!q.isEmpty()){
            Point head=q.poll();      //取出队首元素
            if(head.x==n &&head.y==m){   //如果走到出口
                System.out.println(head.step);
                return;
            }
            for (int i = 0; i < 4; i++) {   //往四个方向走
                x= head.x+dx[i]; y= head.y+dy[i];
                if(x>0 &&x<=n &&y>0 &&y<=m &&!state[x][y] &&p[x][y]==0){ //如果还没有走过并且可以走
                 state[x][y]=true;
                 q.add(new Point(x,y, head.step+1));
                }
            }
        }
    }

    static class Point{
        int x,y,step;
        Point(){
        }

        public Point(int x, int y, int step) {
            this.x = x;
            this.y = y;
            this.step = step;
        }
    }
}

4.Acwing 845. 八数码

4.1题目

https://www.acwing.com/problem/content/847/

4.2解题思路及模拟

暴力穷举。穷举出所有给定序列通过交换能得到的新序列,在穷举过程中保存交换次数。

在穷举过程中,如果出现了结果序列,就输出交换次数。

否则不能得到结果序列,输出 -1。

起始状态: 为 1 2 3 x 4 6 7 5 8

交换一次:

x 与上方元素交换得到: x 2 3 1 4 6 7 5 8

x 与右方元素交换得到: 1 2 3 4 x 6 7 5 8

x 与下方元素交换得到: 1 2 3 7 4 6 x 5 8

交换两次得到:

2 x 3 1 4 6 7 5 8

1 x 3 4 2 6 7 5 8

1 2 3 4 6 x 7 5 8

1 2 3 4 5 6 7 x 8

1 2 3 7 4 6 5 x 8

交换三次得到:

2 3 x 1 4 6 7 5 8

.....

1 2 3 4 5 6 7 8 x

.....

得到了最终结果,输出 3.

4.3Ac代码

import java.util.*;
import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String []s=br.readLine().split(" ");
        String start="";
        for (int i = 0; i < s.length; i++) {
            start+=s[i];
        }
        System.out.println(bfs(start));
        br.close();
    }

    private static Integer bfs(String start) {
        String end="12345678x";
        Queue<String> q=new ArrayDeque<>(); //存储所有状态
        Map<String,Integer> state=new HashMap<>(); //存储每个状态得交换次数
        q.add(start);
        state.put(start,0); //存初始状态
        int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0};//四个方向
        while (!q.isEmpty()){//枚举所有状态
            String head=q.poll();//取出头一个状态并向前寻找(head过程中不能修改,因为有四次变化 而位置都是map[t]+1)
            if(head.equals(end))    return state.get(head);
            int k=head.indexOf('x'); //找到x所在的下标
            int x=k/3,y=k%3;
            for (int i = 0; i < 4; i++) {
                int a=x+dx[i],b=y+dy[i];//变化状态之后x的下标
                if(a>=0 &&a<3 &&b>=0 &&b<3){  //变换后不出界的就是可用的
                char []ch=head.toCharArray();//字符串里面不能交换所以就到字符数组里
                swap(ch,k,a*3+b);
                String s=new String(ch);
                if(state.get(s)==null){//如果这个状态没出现过就存储这个状态
                    q.add(s);
                    state.put(s,state.get(head)+1);
                }
                }
            }
        }
        return -1;
    }

    private static void swap(char[] arr, int x, int y) {
        char c=arr[x];
        arr[x]=arr[y];
        arr[y]=c;
    }
}

5.结尾

如果对java中队列的使用方法不熟悉的话可以看下java叶新东老师的这篇文章

https://blog.csdn.net/qq_27184497/article/details/116093422?ops_request_misc=&request_id=&biz_id=102&utm_term=java%E4%B8%AD%E4%BD%BF%E7%94%A8quene&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-116093422.142^v73^pc_search_v2,201^v4^add_ask,239^v1^insert_chatgpt&spm=1018.2226.3001.4187
感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window11 安装node及配置环境变量

一、安装环境 本教程演示的环境&#xff1a; 系统&#xff1a;win 11 64位 node.js下载地址: http://nodejs.cn/ node.js版本&#xff1a;长期支持版本&#xff08;本教程基于16.15.0&#xff09; 点击选中图标下载到电脑本地即可。 二、安装步骤 1、双击安装包&#xff0c;一…

华为10年经验测试工程师,整理出来的python自动化测试实战

前言 全书共分11章&#xff0c;第一章是基础&#xff0c;了selenium家谱&#xff0c;各种组件之间的关系以及一些必备知识。第二章告诉如何开始用python IDLE写程序以及自动化测试环境的搭建。第三章是webdriver API&#xff0c;我花了相当多时间对原先的文档&#xff0c;冗余…

HTML5之HTML基础学习笔记

列表标签 列表的应用场景 场景&#xff1a;在网页中按照行展示关联性的内容&#xff0c;如&#xff1a;新闻列表、排行榜、账单等特点&#xff1a;按照行的方式&#xff0c;整齐显示内容种类&#xff1a;无序列表、有序列表、自定义列表 这是老师PPT上的内容&#xff0c; 列表…

day10_面向对象基础

今日内容 零、 复习昨日 一、面向对象的概念 二、面向对象编程 三、内存图 零、 复习昨日 见晨考题 每日一数组题 写一个方法 用于合并两个int类型的数组 合并法则如下 {1,2,5,8,9}{1,3,0}---->{1,2,5,8,9,1,3,0} package com.qf.array;import java.util.Arrays;/*** --- 天…

基于Java+SpringBoot+Vue+uniapp前后端分离图书阅读系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…

MySQL在Linux上的四种安装方式

目录 前言 一、仓库安装 二、本地安装 三、容器安装 四、源码安装 前言 博主的配置信息&#xff1a; Windows版本&#xff1a;Win10 VMware虚拟机版本&#xff1a;Vmware Workstation Pro 17 Linux版本&#xff1a;Red Hat Enterprise Linux 9.1 MySQL版本&#xff1a;My…

一篇文章搞懂Cookie

目录 1 什么是Cookie 2 创建Cookie 3 浏览器查看Cookie 3.1 浏览器查看Cookie的第一种方式 3.2 浏览器查看Cookie的第二种方式 4 获取Cookie 5 修改Cookie 6 Cookie编码与解码 6.1 创建带中文Cookie 6.2 读取带中文Cookie 6.3 获取中文Cookie请求效果 6.4 解决创建和…

grafana9 使用消息模板配置发送企业微信(wecom)

一、grafana9告警设置&#xff1a; 1、进入告警消息模板介面 2、grafana 消息模板设置 template name : API_msg_tpl #名字随便 {{ define "myalert" }} **警报时间:** {{ .StartsAt.Format "2006-01-02 15:04:05 " }} {{ if gt (len .Labels) 0 }}**…

毕业5年,从月薪3000到年薪40w,我掌握了那些核心技能?(建议收藏)

大家好&#xff0c;我是静静~~是一枚一线大厂的测试开发工程师很多读者私信问我&#xff0c;自己时间不短了&#xff0c;随着工作年限的不断增长&#xff0c;感觉自己的技术水平与自己的工作年限严重不符。想跳槽出去换个新环境吧&#xff0c;又感觉自己的能力达不到心仪公司的…

Python_pytorch

python_pytorch 小土堆pytotch学习视频链接 from的是一个个的包&#xff08;package) import 的是一个个的py文件(file.py) 所使用的一般是文件中的类(.class) 第一步实例化所使用的类,然后调用类中的方法&#xff08;def) Dataset 数据集处理 import os from PIL impo…

本地(window)使用alist和RaiDav网盘挂载

一、背景 百度网盘的限速可能会让你转战阿里云盘&#xff0c;但是阿里云盘的缺点在于不能分享&#xff0c;网络上的资源都是通过各类网盘来分享的&#xff0c;这样就会让你可能同时拥有不同网盘的账号。 那么我们有没有一款工具&#xff0c;可以将这些网盘资源聚合一下&#xf…

RMQ--区间最值问题(在更)

RMQ&#xff08;Range Minimum/Maximum Query&#xff09;RMQ解决的问题ST算法 O(nlogn)线段树例题数列区间最大值最敏捷的机器人天才的记忆Frequent values总结&#xff08;ST和线段树对比&#xff09;RMQ解决的问题 RMQ是一个解决多个区间最值查询的算法,即区间最值查询&…

MySQL 创建数据表

在创建数据库之后&#xff0c;接下来就要在数据库中创建数据表。所谓创建数据表&#xff0c;指的是在已经创建的数据库中建立新表。 创建数据表的过程是规定数据列的属性的过程&#xff0c;同时也是实施数据完整性&#xff08;包括实体完整性、引用完整性和域完整性&#xff09…

LwIP系列--线程通信消息结构

一、目的如果有小伙伴移植过LwIP&#xff0c;那么你肯定知道在LwIP源码中tcp/ip协议栈是作为一个单独的线程运行的&#xff0c;那么就有这样一个问题&#xff0c;我们从mac外设上收到的以太网数据包是如何交给tcp/ip线程进行处理的&#xff0c;用户发送的数据又是如何经过协议栈…

不学Python迟早会被淘汰?Python真有这么好的前景?

最近几年Python编程语言在国内引起不小的轰动&#xff0c;有超越Java之势&#xff0c;本来在美国这个编程语言就是最火的&#xff0c;应用的非常非常的广泛&#xff0c;而Python的整体语言难度来讲又比Java简单的很多。尤其是在运维的应用中非常的广泛&#xff0c;所以之前出了…

Ubuntu20.04无线网卡驱动安装

文章目录一.未安装无线网卡驱动的Ubuntu20.04联网方式二.Ubuntu20.04无线网卡驱动安装UbuntuU盘启动盘安装好Ubuntu 20.04之后&#xff0c;发现没有无线网络&#xff0c;不过有线可以用。一.未安装无线网卡驱动的Ubuntu20.04联网方式 比较简单的就是直接拉一条网线进行连接&am…

【C语言】宏定义 结构体 枚举变量的用法

目录 一、数据类型 二、C语言宏定义 三、C语言typedef重命名 四、 #define与typedef的区别 五、结构体 六、枚举变量 补充学习一点STM32的必备基础知识 一、数据类型 二、C语言宏定义 关键字&#xff1a;#define 用途&#xff1a;用一个字符串代替一个数字&#xff0c;…

214 情人节来袭,电视剧 《点燃我温暖你》李峋同款 Python爱心表白代码,赶紧拿去用吧

大家好&#xff0c;我是徐公&#xff0c;六年大厂程序员经验&#xff0c;今天为大家带来的是动态心形代码&#xff0c;电视剧 《点燃我温暖你》同款的&#xff0c;大家赶紧看看&#xff0c;拿去向你心仪的对象表白吧&#xff0c;下面说一下灵感来源。 灵感来源 今天&#xff…

2023-02-10 - 6 聚合

当用户使用搜索引擎完成搜索后&#xff0c;在展示结果中需要进行进一步的筛选&#xff0c;而筛选的维度需要根据当前的搜索结果进行汇总&#xff0c;这就用到了聚合技术。聚合的需求在很多应用程序中都有所体现&#xff0c;例如在京东App中搜索“咸鸭蛋”&#xff0c;然后单击搜…

简述操作系统的系统中断

系统中断 系统中断是指 CPU 对系统发生的某个事件做出的一种反应&#xff1a;CPU 暂停正在执行的程序&#xff0c;保留现场后转去执行相应的处理程序&#xff0c;处理完该事件后再返回断点继续执行被打断的程序。 中断可以避免 CPU 轮询等待某条件成立&#xff0c;减小系统开…