P1825 [USACO11OPEN]Corn Maze S——bfs

2023-05-16

[USACO11OPEN]Corn Maze S

题面翻译

奶牛们去一个 N × M N\times M N×M 玉米迷宫, 2 ≤ N ≤ 300 , 2 ≤ M ≤ 300 2 \leq N \leq 300,2 \leq M \leq300 2N300,2M300

迷宫里有一些传送装置,可以将奶牛从一点到另一点进行瞬间转移。这些装置可以双向使用。

如果一头奶牛处在这个装置的起点或者终点,这头奶牛就必须使用这个装置。

玉米迷宫除了唯一的一个出口都被玉米包围。

迷宫中的每个元素都由以下项目中的一项组成:

  1. 玉米,# 表示,这些格子是不可以通过的。
  2. 草地,. 表示,可以简单的通过。
  3. 传送装置,每一对大写字母 A \tt{A} A Z \tt{Z} Z 表示。
  4. 出口,= 表示。
  5. 起点, @ 表示

奶牛能在一格草地上可能存在的四个相邻的格子移动,花费 1 1 1 个单位时间。从装置的一个结点到另一个结点不花时间。

题目描述

This past fall, Farmer John took the cows to visit a corn maze. But this wasn’t just any corn maze: it featured several gravity-powered teleporter slides, which cause cows to teleport instantly from one point in the maze to another. The slides work in both directions: a cow can slide from the slide’s start to the end instantly, or from the end to the start. If a cow steps on a space that hosts either end of a slide, she must use the slide.

The outside of the corn maze is entirely corn except for a single exit.

The maze can be represented by an N x M (2 <= N <= 300; 2 <= M <= 300) grid. Each grid element contains one of these items:

* Corn (corn grid elements are impassable)

* Grass (easy to pass through!)

* A slide endpoint (which will transport a cow to the other endpoint)

* The exit

A cow can only move from one space to the next if they are adjacent and neither contains corn. Each grassy space has four potential neighbors to which a cow can travel. It takes 1 unit of time to move from a grassy space to an adjacent space; it takes 0 units of time to move from one slide endpoint to the other.

Corn-filled spaces are denoted with an octothorpe (#). Grassy spaces are denoted with a period (.). Pairs of slide endpoints are denoted with the same uppercase letter (A-Z), and no two different slides have endpoints denoted with the same letter. The exit is denoted with the equals sign (=).

Bessie got lost. She knows where she is on the grid, and marked her current grassy space with the ‘at’ symbol (@). What is the minimum time she needs to move to the exit space?

输入格式

第一行:两个用空格隔开的整数 N N N M M M

2 ∼ N + 1 2\sim N+1 2N+1 行:第 i + 1 i+1 i+1 行描述了迷宫中的第 i i i 行的情况(共有 M M M个字符,每个字符中间没有空格)。

输出格式

一个整数,表示起点到出口所需的最短时间。

样例 #1

样例输入 #1

5 6
###=##
#.W.##
#.####
#.@W##
######

样例输出 #1

3

提示

例如以下矩阵, N = 5 , M = 6 N=5,M=6 N=5,M=6

###=##
#.W.##
#.####
#.@W##
######

唯一的一个装置的结点用大写字母 W \tt{W} W 表示。

最优方案为:先向右走到装置的结点,花费一个单位时间,再到装置的另一个结点上,花费 0 0 0 个单位时间,然后再向右走一个,再向上走一个,到达出口处,总共花费了 3 3 3 个单位时间。

分析

  1. 此题就是迷宫问题求最短路,加上n,m的范围,直接bfs,第一眼看见传送门想到了T1215 拯救公主——bfs+三维数组标记+二进制状态压缩,以为麻烦来了,但是发现此题简单,不需要去拿宝石之类,空手到达终点即可;
  2. 注意点:在找传送门的另一半时,需要加上 (i != x || j != y),别找了个他自己本身;其次就是如果走到传送门必须传送,如下图样例,不能直接@到A然后A再直接到终点=,这是错的,此题走到传送门要求必须传送,然后传送门不用打标记(vis),因为传送门可以来回传送
    在这里插入图片描述
    在这里插入图片描述
#include<bits/stdc++.h>

using namespace std;

struct node {
    int x, y, step;

    node(int xx, int yy, int ste) {
        x = xx, y = yy, step = ste;
    }
};

int n, m;
char a[305][305];
int vis[305][305];
queue<node> q;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

pair<int, int> findDoor(char c, int x, int y) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            //不能找到它本身
            if (a[i][j] == c && (i != x || j != y))
                return {i, j};
        }
    }
}

void bfs() {
    while (!q.empty()) {
        node now = q.front();
        q.pop();
        int x = now.x, y = now.y, step = now.step;
        if (a[x][y] == '=') {
            cout << step;
            return;
        }
        for (int i = 0; i < 4; i++) {
            int xx = x + dx[i];
            int yy = y + dy[i];
            if (xx >= 0 && yy >= 0 && xx < n && yy < m && !vis[xx][yy] && a[xx][yy] != '#') {
                vis[xx][yy] = 1;
                //传送门, 把传送到的点放入队列(传送门自己本身可以不加队列里,把它到的目的传送门加队列)
                if (a[xx][yy] >= 'A' && a[xx][yy] <= 'Z') {
                    //获取传送的目的地
                    pair<int, int> p = findDoor(a[xx][yy], xx, yy);
                    xx = p.first, yy = p.second;
                    //传送门不标记,随便传
                    vis[p.first][p.second] = 0;
                }
                //(xx,yy)可能是另一半的传送门,也可能是草地'.'
                q.push(node(xx, yy, step + 1));
            }
        }
    }
}

int main() {
    cin >> n >> m;
    int startx, starty;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> a[i][j];
            if (a[i][j] == '@')
                startx = i, starty = j;
        }
    }
    q.push(node(startx, starty, 0));
    vis[startx][starty] = 1;
    bfs();
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

P1825 [USACO11OPEN]Corn Maze S——bfs 的相关文章

  • C/C++无向图的遍历(bfs和dfs)

    描述 简单介绍一下图 xff0c 图就是由一些小圆点 xff08 称为顶点 xff09 和连接这些小圆点的直线 xff08 称为边 xff09 组成的 例如下图的由五个顶点 xff08 编号1 2 3 4 5 xff09 和五条边 xff0
  • BFS题单总结

    BFS题单汇总 此文章用来记录遇到的经典的从某个点到达某个边界或者指定点的BFS题目 xff0c 将持续更新 1926 迷宫中离入口最近的出口 span class token keyword class span span class t
  • dfs和bfs能解决的问题

    一 理解暴力穷举之dfs和bfs 暴力穷举 暴力穷举是在解决问题中最常用的手段 xff0c 而dfs和bfs算法则是这个手段的两个非常重要的工具 其实 xff0c 最简单的穷举法是直接遍历 xff0c 如数列求和 xff0c 遍历一个数组即
  • Olya and Energy Drinks【Codeforces 877D】【BFS+思维+剪枝】

    Codeforces Round 442 Div 2 D 这天给学弟学妹们出了这道题 没想到背锅了 感觉要0A了 QAQ 确实 今天我再次写的时候也WA了好几发 哎 这锅背了 看到有些的代码code 访问过的点都标记为mp x y 但是这样
  • 2019年第十届蓝桥杯省赛A组(C/C++组)迷宫(BFS)

    试题 D 迷宫 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从一个位置走到这 个它
  • 判断二叉树是否为完全二叉树

    判断二叉树是否为完全二叉树 提示 本节仍然是重点说二叉树的DP递归套路 非常重要而且容易理解 二叉树的动态规划树形DP递归套路系列文章有这些 可以帮助你快速掌握树形DP的题目解题思想 就一个套路 1 判断二叉树是否为平衡二叉树 树形DP 树
  • LeetCode第127题解析

    给定两个单词 beginWord 和 endWord 和一个字典 找到从 beginWord 到 endWord 的最短转换序列的长度 转换需遵循如下规则 每次转换只能改变一个字母 转换过程中的中间单词必须是字典中的单词 说明 如果不存在这
  • 层序遍历与BFS广度(宽度)遍历搜索算法(C++)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 8 COPYRIGHT 原创技术
  • HDU--1242:Rescue (BFS)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1242 2 易错点 可能存在多个朋友 即多个map 中有多个 r 所以起始点为Angel的位置 最短时间为到达最近的朋友的时间 3 源代码 H
  • 【算法学习笔记】17:DFS与BFS

    1 DFS 深度优先搜索常用于解决需要给出所有方案的问题 因为它的搜索顺序就是能够得到一个完整的搜索路径 方案 后回退再去搜索其它的方案 1 1 例题 排列数字 由于要求所有排列的方案 可以每次从 1 n 1 n 1 n里拿一个数字 然后记
  • PowerOJ2512: 小红灌溉【染色】

    题目链接 划重点 每个有菜的点只能浇一次且恰好一次 所以意思就是 譬如某个菜的位置是 x y 那么 行x 列y的浇水方案只能使用其中的一个 以此类推 我们给每个有蔬菜的位置的 x y 的x点与y点链接一条无向边 代表x和y只能选择其中的一个
  • 天梯题集——愿天下有情人都是失散多年的兄妹(隐藏条件)

    愿天下有情人都是失散多年的兄妹 解题思路 利用结构体读入每个 ID 下数据 隐藏条件 标记父母的性别 卡死个人 假设判断 a b 是否可通婚 同性输出 Never Mind 不同性 bfs标记 a 的五代内的祖先 check检查 b 五代内
  • LeetCode——1302. 层数最深叶子节点的和

    题目描述 给你一棵二叉树的根节点 root 请你返回层数最深的叶子节点的和 示例 1 输入 root 1 2 3 4 5 null 6 7 null null null null 8 输出 15 示例 2 输入 root 6 7 8 2 7
  • 仙岛求药 —— dfs 与 bfs求解

    样例输入1 8 8 样例输出1 10 样例输入2 9 6 样例输出2 1 dfs ps 使用dfs会运行超时 30组测试数据只能通过部分 其实这种最短路径 最少操作的问题最好还是靠bfs解决 import java util Scanner
  • 找到穿过迷宫的所有可能路径

    我正在尝试创建一个程序 该程序将遍历一个随机生成的迷宫 其中 1 是开放的 0 是墙壁 从左上角开始 到右下角结束 路径可以向上 向下 向左 向右 目前 我的程序为我提供了一种解决方案 但我无法让它打印多个路径 我已经阅读了这个问题的几个不
  • 生成分段迷宫的算法

    I want to generate a maze that looks like this 也就是说 它由一个方向上的路径组成 然后将这些路径连接起来 我一直在寻找一种算法来生成这样的迷宫 但没有成功 具体来说 我don t想要一个这样的
  • 为迷宫墙添加碰撞

    有人可以帮我向我的精灵添加碰撞点吗 我过去有一个代码 我在图像上分层了位图 但相同的代码不能很好地集成用于物理绘制线条 而不是检测图像上黑色 灰色的位置 import random import pygame pygame init WHI
  • Java 递归暴力迷宫求解器

    在尝试编写一个强力解决迷宫的 C 程序时 我首先编写了这个 java 程序来测试一个想法 我对 C 很陌生 打算在 Java 中正确使用它后将其转换 因此 我尝试远离数组列表 花哨的库等 以便更容易转换为 C 该程序需要生成最短步骤的单宽度
  • 将简单的单色绘图图像转换为二维文本数组

    我正在尝试开发一种算法 将简单的单线图像 即迷宫 转换为文本二维数组 例如 下面的图像 它将被转换为以下文本数组
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之

随机推荐

  • windows权限维持之shift后门

    原理 xff1a 沾滞键的目的是为了帮助那些按键有困难的人设计的 xff0c 在Windows系统下连续按5次shift键后 xff0c 系统就会执行C Windows System32下的sethc exe xff0c 也就是启用了沾滞键
  • PostgreSQL数据库smallint、bigint转到Oracle,要用什么类型替代? 是number么,那长度分别是多少?...

    个人意见 xff0c 仅供参考 xff1a smallint是有符号或无符号2字节的整数 xff0c 范围是0 xff5e 65 536 xff0c 5位整数 bigint是有符号或无符号8字节的整数 xff0c 范围是0 xff5e 18
  • 网络安全计算机基础

    计算机网络概念 xff1a 实际上是将分布在不同地理位置 xff0c 且具有独立功能的计算机 通过通信链路以及通信设备 xff0c 在网络操作系统 xff0c 网络管理软件及网络通信协议的管理和协调下实现信息传输与资源共享形成的计算机系统
  • ImportError:No module named ‘PIL‘

    运行时报错 xff1a ImportError No module named 39 PIL 原因是缺失一个pillow的数据包 xff0c 不能直接 pip install PIL xff0c 会提示找不到这个安装包 xff0c 需使用如
  • c++中#与##的作用

    1 c 43 43 中 用于把转换成字符串 define T A A 没有使用 using namespace std int main cout lt lt 34 T 2 34 lt lt T 2 lt lt endl cout lt l
  • 人工智能实验——八数码难题

    人工智能实验 八数码难题 人工智能实验 八数码难题 人工智能实验 八数码难题八数码难题简介八数码难题所用到的算法简介代码实现解释运行结果显示代码附件程序可视化 八数码难题简介 八数码问题指的是定义一个3 times 3的格子 xff0c 然
  • idea报错unable to reload maven project

    文章目录 前言一 问题状况二 解决步骤三 卸载maven仓库四 重新安装依赖总结 前言 今天从公司的svn中检出了一个老项目 xff0c 是jQuery 43 spring打造的项目 xff0c emmmm用eclipse编写 xff0c
  • VNC树莓派无法连接

    问题 xff1a 树莓派配置好VNC后 xff0c 第二次通过笔记本远程连接失败 xff0c 报错refused by the computer 解决方法 xff1a 在putty中输入IP地址登录树莓派 xff0c 输入vncserver
  • 经典LCA例题:P4180 [BJWC2010] 严格次小生成树

    Acwing xff1a 严格次小生成树 xff08 求两点间路径上最大边的权值 xff09 模板 洛谷 xff1a 严格次小生成树 求两点间路径上最大边的权值 xff0c 就不能通过前缀和了 xff0c 会丢失信息 每个结点存到其他结点的
  • linux下的压缩与解压缩

    由于计算机中的数据有些需要备份从而归档一个大文件中 下面介绍一下常用的linux压缩解压缩命令 1 关于tar的命令 参数解析 xff1a c 创建生成打包的文件 v 列出打包和解包的详细过程 xff0c 显示进度 f 指定文档的名称 xf
  • 关于fixed frame【odom】does not exist的问题

    在执行完roslaunch mbot description arbotix mbot with camera xacro launch后 xff0c 终端末端是否出现以下一段红色字体 xff0c 若有 xff0c 则此篇文章对你或许有用
  • Linux安装配置Tomcat

    1 下载Tomcat服务器 链接 xff1a https pan baidu com s 15wEXVJWdUUuXX1xRnXylUQ 提取码 xff1a 1234 官网下载 xff1a Apache Tomcat Apache Tomc
  • Oracle类型number与PG类型numeric对比和转换策略

    Oracle 11g number 任意精度数字类型 http docs oracle com cd B28359 01 server 111 b28318 datatype htm CNCPT313 存储数据的范围 正数 xff1a 1
  • 强制关闭linux进程

    问题 xff1a 卡住 xff0c 鼠标可以移动但点击无反应 xff0c 键盘可用 方法 xff1a xff08 1 xff09 Ctrl 43 Alt 43 T 打开终端 xff0c 输入top xff0c 显示的全是现在系统的进程 xf
  • 【计算机系统遇到的问题】win11权限开启方法——相机、麦克风等权限——“其中一些设置由你组织管理”

    win11更新后 xff0c 想必大家应该会出现跟我一样的问题 无法开启权限 xff0c 不知道在哪开启权限 我是在下午跟我老爸视频电话的时候发现这个问题的 xff0c 点击开摄像头 xff0c 但是我这边跟老爸那边却没有我的画面 xff0
  • gitlab安装部署

    本教程使用centos7 6 首先安装依赖包 yum install y curl policycoreutils python openssh server 如下提示相关依赖安装完成 安装步骤如下 xff1a 1 使用官方脚本添加yum源
  • 用51单片机中断控制LED灯亮灭

    用51单片机中断控制LED灯亮灭 span class token macro property span class token directive keyword include span span class token string
  • HDFS

    xff08 一 xff09 HDFS简介及其基本概念 HDFS xff08 Hadoop Distributed File System xff09 是hadoop生态系统的一个重要组成部分 xff0c 是hadoop中的的存储组件 xff
  • 如何在服务器用docker搭建Redis集群

    用docker部署Redis集群 这里用的是分片 43 高可用 43 负载均衡 xff0c 三主三从 第一步创建网卡 span class token comment 创建网卡 span span class token function
  • P1825 [USACO11OPEN]Corn Maze S——bfs

    USACO11OPEN Corn Maze S 题面翻译 奶牛们去一个 N M N times M N M 玉米迷宫 xff0c 2