Acwing---1101. 献给阿尔吉侬的花束

news2024/9/20 16:54:45

献给阿尔吉侬的花束

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。

今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。

现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。迷宫用一个 R × C R×C R×C 的字符矩阵来表示。

字符 S S S 表示阿尔吉侬所在的位置,字符 E E E 表示奶酪所在的位置,字符 # 表示墙壁,字符 . 表示可以通行。

阿尔吉侬在 1 个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。

输入格式
第一行是一个正整数 T,表示一共有 T组数据。

每一组数据的第一行包含了两个用空格分开的正整数 R 和 C,表示地图是一个 R×C的矩阵。接下来的 R 行描述了地图的具体内容,每一行

包含了 C 个字符。字符含义如题目描述中所述。保证有且仅有一个 S 和 E。

输出格式
对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。

若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。

每组数据的输出结果占一行

数据范围
1 < T ≤ 10 1<T≤10 1<T10,
2 ≤ R , C ≤ 200 2≤R,C≤200 2R,C200

输入样例:

输出样例:

5
1
oop!

2.基本思想

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

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

宽搜一般模板

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

在这里插入图片描述

BFS能找到 最小的步数,即 最短路径 ,而 DFS 找到的不一定最短。

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

3.代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class _1101献给阿尔吉侬的花束 {
    static class PII { //保存坐标
        int x, y;

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

    static final int N = 210;
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static char[][] g = new char[N][N];//保存迷宫信息
    static int[][] dis = new int[N][N];//dis 存储起点到每个点的路径长度 同时当作判重 数组
    static int r, c;

    public static void main(String[] args) throws IOException {
        int T = Integer.parseInt(br.readLine());
        while (T-- > 0) {
            String[] s = br.readLine().split(" ");
            r = Integer.parseInt(s[0]);
            c = Integer.parseInt(s[1]);// r 行 每行 c 个字符
            for (int i = 0; i < r; i++) {//一次读取一行
                g[i] = br.readLine().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);
        }
    }

    private static int bfs(PII start, PII end) {//BFS
        Queue<PII> queue = new LinkedList<>();//建立一个队列
        for (int i = 0; i < r; i++) Arrays.fill(dis[i], -1);//先把距离都初始化为-1,-1表示不可到达

        dis[start.x][start.y] = 0;//表示起点已经走过了,且距离起点为0
        queue.offer(start);//将起点放入队列

        int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};//建立数组 方便找到 上下左右 四个方向的元素
        while (!queue.isEmpty()) {//当队列非空
            PII t = queue.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 (end.x == x && end.y == y) return dis[x][y];//如果当前已经走到终点,直接返回当前dis
                //没结束 继续
                queue.offer(new PII(x, y));
            }
        }
        return -1;
    }
}

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

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

相关文章

MYSQL不存在插入 存在更新的解决方法和对比

设置主键id自增&#xff0c;name为唯一索引 一、避免重复插入 insert ignore into&#xff08;有唯一索引&#xff09; 关键字/句: insert ignore into&#xff0c;如果插入的数据会导致 UNIQUE索引 或 PRIMARY KEY 发生冲突/重复&#xff0c;则忽略此次操作/不插入数据&…

Leetcode.1664 生成平衡数组的方案数

题目链接 Leetcode.1664 生成平衡数组的方案数 题目描述 给你一个整数数组 nums。你需要选择 恰好 一个下标&#xff08;下标从 0 开始&#xff09;并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。 比方说&#xff0c;如果 nums[6,1,7,4,1]nums [6,1…

spark转化操作

文章目录转化操作Transformer算子概念单RDD转换函数多RDD转换函数map与flatmap转化操作 由于spark的惰性计算特性&#xff0c;RDD只有在第一次行动操作中被用到时才会真正进行计算&#xff0c;因此我打算将文章内容分为"转化操作"和"行动操作"两部分&…

【web】微信小程序笔记小结(视图与逻辑)

过完年回来干正事了orz 来源&#xff1a;黑马程序员前端微信小程序开发教程 目录 I. 页面导航 ① 概念 ② 导航方式 1&#xff09;声明式导航 ※※ 导航到 tabBar 页面 ※※ 导航到非 tabBar 页面 ※※ 后退导航 2&#xff09;编程式导航 ※※ 导航到 tabBar 页面…

Nature立新规:ChatGPT等大模型不可以成为作者

众所周知&#xff0c;AI 的超参数决定着模型学习效果和速度。相比普通机器学习任务&#xff0c;深度学习需要的训练时间较长&#xff0c;因此调参技巧就显得尤为重要。 但鉴于深度学习「炼丹」的特性&#xff0c;不同的模型需要不同的超参数&#xff0c;而每个超参的意义又不同…

【头歌】汉诺塔(Hanoi)的递归算法

任务描述本关任务&#xff1a;汉诺塔(Hanoi)的递归算法。相关知识相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标&a…

C语言中数组变量作为函数参数传值的两种方式:数组类型 指针类型 以及“C语言中数组变量(名)的本质是指针变量”

文章目录Intro & SummaryCode & Output运行截图Code关于数组长度在被调函数中的计算错误运行截图 & 警告信息Code数组变量是一类特殊的、指向自己的指针变量Intro & Summary 我在 main 函数中定义了一个数组&#xff0c;要将该数组作为参数传递给其他方法。那…

Lesson 4.3 梯度下降(Gradient Descent)基本原理与手动实现

文章目录一、梯度下降基本原理与学习率1. 数据背景与最小二乘法求解2. 一维梯度下降基本流程2.1 参数移动第一步2.2 梯度下降的多轮迭代3. 梯度下降算法特性与学习率二、梯度下降一般建模流程与多维梯度下降1. 多维梯度下降与损失函数可视化2. 梯度下降计算流程3. 二维梯度下降…

jvm学习的核心(四)---执行引擎和字符串

知识点总结于b站宋红康老师&#xff0c;视频链接 文章目录1.执行引擎1.1.执行引擎概述1.2.执行引擎的工作流程1.3.jvm的解释器和即时编译器&#xff08;JIT&#xff09;1.3.1.解释器&#xff0c;即时编译器概述1.3.2.常见即时编译器1.3.3.热点代码探测1.String Table1.1 string…

Go语言基础入门第三章

常量 常量是一个简单值的标识符&#xff0c;在程序运行时&#xff0c;不会被修改的量。 常量中的数据类型只可以是布尔型、数字型&#xff08;整数型、浮点型和复数&#xff09;和字符串型。 const identifier [type] value可以省略类型说明符[type]&#xff0c;因为编译器…

法律常识(三)《合同法》中的借款合同租赁合同摘录

目录 参考 一、借款合同 二、租赁合同 参考 中华人民共和国合同法 一、借款合同 第一百九十六条 借款合同是借款人向贷款人借款&#xff0c;到期返还借款并支付利息的合同。 第一百九十七条 借款合同采用书面形式&#xff0c;但自然人之间借款另有约定的除外。借款合同…

瑞吉外卖 对象转换器 公共字段自动填充 文件上传/下载

https://blog.csdn.net/weixin_43715214/category_12022798.html大佬记录项目介绍day01功能架构&#xff08;1&#xff09;用户层本项目中在构建系统管理后台的前端页面&#xff0c;我们会用到H5、Vue.js、ElementUI等技术。而在构建移动端应用时&#xff0c;我们会使用到微信小…

Red Giant Magic Bullet Suite介绍

Red Giant Magic Bullet Suite介绍什么是Magic Bullet SuiteMagic Bullet Suite功能介绍什么是Magic Bullet Suite Magic Bullet Suite是电影制作人不可或缺的一套调色降噪插件&#xff0c;它能够为您制作出和好莱坞一样的效果&#xff0c;为电影制作人提供专业的色彩校正。可…

excel函数应用:最简单的条件求和函数DSUM

SUM系列求和函数是我们日常工作中最常用的函数&#xff0c;相信大部分朋友对SUMIF、SUMIFS、SUMPRODUCT等函数都已经比较熟悉了。但是有一个求和函数大家可能都不熟悉&#xff0c;它就是DSUM函数&#xff0c;用于求数据库中记录的满足给定条件的的字段&#xff08;列&#xff0…

在中国社科院与美国杜兰大学金融管理硕士项目就读,重焕青春活力

在职场摸爬滚打多年后的你&#xff0c;是否有觉得内心疲惫&#xff1f; 是否进入到职场倦怠期&#xff1f;今天是春节后的首个工作日&#xff0c;新的一年意味着新的开始。你有想过在职继续攻读硕士学位吗&#xff1f;在中国社科院与美国杜兰大学金融管理硕士项目就读&#xff…

vue中实现打印

一、VUE 集成 LODOP插件打印 VUE 集成LODOP插件打印 Lodop、C-Lodop使用说明及样例 C-Lodop插件官网&#xff1a;功能演示 - Lodop和C-Lodop官网主站 参考文章&#xff1a;VUE 集成 LODOP插件打印_廷贺的博客-CSDN博客 二、winodw.print() 打印 print() 方法用于打印当前…

vs2015软件打包及常见问题解决方法

一、如程序文件是64位&#xff0c;而项目设置32位&#xff0c;打包项目编译时遇到如下问题 解决办法&#xff1a;选择打包程序项目的属性窗口设置TargetPlatform属性为对应的值&#xff0c;本项目的文件是64位的所以设置打包生成的程序为64位的&#xff0c;如下&#xff1a; …

【可解释性机器学习】排列重要性(Permutation Importance)及案例分析详解

Permutaion Importance&#xff1a;排列重要性引言工作原理代码示例排列重要性结果解读模型检验特征选择补充分析Partial Dependency PlotSharpley ValueLIME总结参考资料当训练得到一个模型之后&#xff0c;除了对模型的预测感兴趣之外&#xff0c;我们往往还想知道模型中哪些…

DDOS渗透与攻防(三)之socktress攻击

系列文章 DDOS渗透与攻防(一)之拒绝服务攻击概念介绍 DDOS渗透与攻防(二)之SYN-Flood攻击 socktress攻击 攻击协议原理介绍说明-socktress 2008年有Jack C.Louis发现&#xff0c;针对TCP服务的拒绝服务攻击&#xff1a; 消耗被攻击目标系统资源&#xff0c;与攻击目标建立…

xml配置JedisUtil

一.背景 习惯了Bean注解方式往sping容器中注入对象&#xff0c;现使用xml方式注入Bean对象总结下&#xff0c;顺便用帮女朋友解决的Jedis问题当做案例来总结。 二.配置JedisPool 从源码来看&#xff0c;JedisPool的构造函数有N多种 我们使用如下的构造函数来实例化JedisPool…