AcWingP1101. 献给阿尔吉侬的花束-bfs(宽度优先搜索)

news2024/11/24 15:45:03

题目链接

搜宽每次取出队头元素,然后将该队头元素扩展出的所有元素放到队尾

需要的数组:

  • 判重数组:st[] 一般是入队时判重(这样可以保证每一个点入队一次)
  • queue 队列

 宽搜一般模板

queue  <- 初始状态入队  //先将某个初始状态入队
while(queue 非空)
{
    t <- 队头  //每次取出队头元素放到t中
    for(扩展t) //扩展t结点
    {
        ver <- 新节点
        if(! st[ver]) //入队判重
        {
            ver -> 队尾 //新节点插入队尾
        }
    }
}

BFS能找到最少步数,也就是最短路径

因为BFS是按层来遍历的,会先把所有距离为0的点遍历完,然后再遍历所有距离为1的点,按这样的顺序来遍历的,再遍历所有距离为2的点,一层一层往外扩展,因此第一次扩展到终点时,必然是最短距离

import java.util.*;
/**
 * 采用宽度搜索,一定能找到最小距离,因为是按照由近到远的距离来寻找,先遍历距离为0.为1,为2....依次遍历
 * @author abc
 *
 */
public class P1101 {
    static final int N = 210;
    static int r;//行数
    static int c;//列数
    static char[][] g = new char[N][N];//用来存放地图
    static int[][] dis = new int[N][N];//用来表示距离原点的距离,同时可以充当判重数组,初始值为-1,若该值不等于-1,则表示,该点已经走过了
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int t = scan.nextInt();
        while(t -- > 0) {
            r = scan.nextInt();
            c = scan.nextInt();
            for(int i = 0;i < r;i ++) g[i] = scan.next().toCharArray();//按行输入字符串,并转换为字符数组
             PII start = null, end = null; //定义起点、终点
            for(int i = 0;i < r;i ++) {//遍历地图中的每一个点,寻找起始点和终止点的坐标
                for(int j = 0;j < c;j ++) {
                    if(g[i][j] == 'S') start = new PII(i,j);
                    else if(g[i][j] == 'E') end = new PII(i,j);
                }

            }
            int distance = bfs(start,end);//进行广度搜索,将起始点和终止点的坐标带入
            if(distance == -1) System.out.println("oop!");
            else System.out.println(distance);
        }
    }
    public static int bfs(PII start,PII end) {
        Queue<PII> q = new LinkedList<>();//创建一个队列,类型为PII
        for(int i = 0;i < r;i ++) Arrays.fill(dis[i], -1);//首先将dis数组中都初始化为-1,用作判重数组
        dis[start.x][start.y] = 0;//起始点也即是原点,距离为0
        q.offer(start);//将起点放入队列头部
        int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};//创建两个数组,分别存放上下左右四个方向的坐标
        while(!q.isEmpty()) {//若队列不为空,则进行操作
            PII t = q.poll();//首先将队头元素取出并移除
            for(int i = 0;i < 4;i ++) {//循环,让该点往上下左右四个方向走,扩展该点(队头元素)
                int x = t.x  + dx[i],y = t.y + dy[i];//坐标走到相应的地方
                if( x < 0 || x >= r || y < 0|| y >= c) continue;//出界
                if(g[x][y] == '#') continue;//撞墙
                if(dis[x][y] != -1) continue;//已经走过的
                dis[x][y] = dis[t.x][t.y] + 1;//前几个条件如果都不满足的话则可以向前行走,此时距离起点+1;
                if(x == end.x && y == end.y) return dis[x][y];//若走到重点,则将距离原点的距离返回
                q.offer(new PII(x,y));//若没到达,则将这个位置作为新的队列对头元素,并进行后面一系列的扩展操作
            }
        }

        return -1;
    }
}         
对应C++中的Pairs<int, int>
class PII{
    int x ;//每个点的横坐标
    int y;//每个点的纵坐标
    public PII(int x,int y) {
        this.x = x;
        this.y = y;
    }
}

 

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

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

相关文章

webots的安装和体验

刚知道webots是一个机器人仿真软件&#xff0c;好像离开硬件可以自己玩玩&#xff0c;而且有人形机器人的源代码&#xff0c;试试看吧。 Cyberbotics: Robotics simulation with Webotshttps://www.cyberbotics.com/ 官网下载&#xff0c;有windows版本&#xff0c;看上去好简…

java小型人事管理系统

开发工具&#xff1a; MyEclipseJdkTomcatSQLServer数据库 运行效果视频&#xff1a; https://pan.baidu.com/s/1hshFjiG 定制论文&#xff0c;联系下面的客服人员

微服务网关Spring Cloud Gateway有什么作用?

一、背景 现在的spring cloud生态中&#xff0c;spring cloud gateway是一个非常重要的组件。它是一款API网关服务&#xff0c;在微服务架构中扮演了关键角色&#xff0c;它为微服务架构中的请求提供了路由、转发和过滤的功能。此外&#xff0c;还提供了负载均衡、限流和鉴权的…

ARCGIS PRO SDK 图层唯一值渲染

一、如果【地块回退】为面, 按"DKMC"字段&#xff0c;在面中心配置符号Pushpin Await QueuedTask.Run(Sub()pFeaturelayer pmap.FindLayers("地块回退").First()-----------------唯一值渲染Dim Fields New List(Of String) From {"DKMC"} …

Unity中UGUI中的PSD导入工具的原理和作用

先说一下PSD导入工具的作用&#xff0c;比如在和美术同事合作开发一个背包UI业务系统时&#xff0c;美术做好效果图后&#xff0c;程序在UGUI中制作好界面&#xff0c;美术说这个图差了2像素&#xff0c;那个图位置不对差了1像素&#xff0c;另外一个图大小不对等等一系列零碎的…

【嵌入式DIY实例】-自动割草机器

自动割草机器 文章目录 自动割草机器1、割草机器介绍2、硬件准备3、功能设计4、硬件接线5、代码实现本文将介绍如何使用 Arduino 构建一个简易自动割草机机器人或割草机机器人。该机器人可以自动剪掉花园里多余的草。如果花园里有障碍物,它会自动改变方向。帮助以减少人力。 警…

AI - 支持向量机算法

&#x1f9e8;概念 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种强大的机器学习算法&#xff0c;主要用于解决二分类问题。 SVM的核心思想是找到一个超平面&#xff0c;这个超平面能够最好地将数据分为两类&#xff0c;即在保证分类准确的情况下&am…

LGB2028 反向输出一个三位数

&#xff08;LG是洛谷&#xff08;洛谷&#xff09;的意思&#xff09; 题目链接&#xff1a;B2028 题目描述 将一个三位数反向输出&#xff0c;例如输入 358&#xff0c;反向输出 853。 输入格式 一个三位数 n。 输出格式 反向输出 n。 输入输出样例 输入 #1 100 输…

MySQL语法分类 DQL(3)排序查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

CI/CD实战-gitlab代码仓库 2

gitlab安装部署 实验虚拟机最小需求&#xff1a;4g内存&#xff0c;4核cpu 下载源&#xff1a;Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 安装依赖性&#xff1a; 安装软件&#xff1a; 修改依赖性配置文件 重新自动化配置 登录…

Windows kafka 简单集群搭建

Windows kafka 简单集群搭建 文章目录 Windows kafka 简单集群搭建1.环境说明2.Zookeeper集群搭建2.1 ZooKeeper下载2.2 ZooKeeper安装2.2.1 解压zookeeper-3.4.8.tar.gz2.2.2 进入conf目录下&#xff0c;复制zoo_sample.cfg为zoo.cfg2.2.3 修改zoo.cfg文件2.2.4 生成myid文件2…

Spring MVC 如何接收请求

1. 请求 浏览器访问不同的路径就是发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带有一些参数&#xff0c;所以我们就需要在后端接受参数。 2. 传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接使用方法中的参数即可&#xff1a; RequestMapping(&qu…

C++中的struct与class详解

在C中&#xff0c;struct和class都是用户定义类型&#xff08;UDT&#xff09;的关键字&#xff0c;用于封装数据和函数。尽管它们在许多方面都非常相似&#xff0c;但也存在一些关键差异。 1. 默认访问权限 • **struct**&#xff1a;默认的成员访问权限是public。• **clas…

jvm的垃圾回收器以及触发full gc的场景

JVM&#xff08;Java虚拟机&#xff09;的垃圾回收器有很多种&#xff0c;主要包括以下几种&#xff1a; Serial收集器&#xff1a;串行收集器是最古老、最稳定的收集器。它使用单个线程进行垃圾收集工作&#xff0c;在进行垃圾回收时会暂停所有用户线程。 ParNew收集器&#…

nginx实时流量拷贝ngx_http_mirror_module

参考&#xff1a; Module ngx_http_mirror_module Nginx流量拷贝ngx_http_mirror_module模块使用方法详解 ngx_http_mirror_module用于实时流量拷贝 请求一个接口&#xff0c;想实时拷贝这个请求转发到自己的服务上&#xff0c;可以使用ngx_http_mirror_module模块。 官网好像…

本地用AIGC生成图像与视频

最近AI界最火的话题&#xff0c;当属Sora了。遗憾的是&#xff0c;Sora目前还没开源或提供模型下载&#xff0c;所以没法在本地跑起来。但是&#xff0c;业界有一些开源的图像与视频生成模型。虽然效果上还没那么惊艳&#xff0c;但还是值得我们体验与学习下的。 Stable Diffu…

python3GUI--qt仿暴风影音视频播放器By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;环境1.开发环境2.打包环境3.运行环境 三&#xff0e;软件截图1.启动页2.视频播放3.音频播放4.其他1.托盘2.对话框 四&#xff0e;功能总览五&#xff0e;代码展示&心得1.UI设计2.如何防止卡顿3.如何自定义组件 五&#xff0e;思考…

实在智能Agent——RPA终极进化方向

RPA技术备受瞩目&#xff0c;它通过“机器人”自动化了人力执行的重复性、低复杂度任务&#xff0c;解放了员工并降低了企业成本。RPA机器人全天候运行&#xff0c;避免人为错误&#xff0c;高效处理任务&#xff0c;成为处理事务、操作数据、回应查询的理想选择。在管理后台&a…

HTML基础:了解CSS的3种创建方法

你好&#xff0c;我是云桃桃。 CSS&#xff0c;即层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;是一种用于描述网页样式和布局的标记语言。它通过定义样式规则来控制网页元素的外观和排版&#xff0c;包括文字大小、颜色、边距、背景等&#xff0c;从…

mac打开exe文件的三大方法 mac怎么运行exe文件 mac打开exe游戏 macbookpro打开exe

exe文件是Windows系统的可执行文件&#xff0c;虽然Mac系统上无法直接打开exe文件&#xff0c;但是你可以在Mac电脑上安装双系统或者虚拟机来实现mac电脑上运行exe文件。除了这两种方法之外&#xff0c;你还可以在Mac电脑上使用类虚拟机软件打开exe文件&#xff0c;这三种方法各…