P1825 [USACO11OPEN]Corn Maze S 【BFS】

2023-05-16

题目描述

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×M的矩阵(2 ≤ N ≤ 300; 2 ≤ M ≤ 300),矩阵中的每个元素都由以下项目中的一项组成:

 玉米,这些格子是不可以通过的。

 草地,可以简单的通过。

 一个装置的结点,可以将一头奶牛传送到相对应的另一个结点。

 出口

奶牛仅可以在相邻两个格子之间移动,要在这两个格子不是由玉米组成的前提下才可以移动。奶牛能在一格草地上可能存在的四个相邻的格子移动。从草地移动到相邻的一个格子需要花费一个单位的时间,从装置的一个结点到另一个结点需要花费0个单位时间。

被填充为玉米的格子用“#”表示,草地用“.”表示,每一对装置的结点由相同的大写字母组成“A-Z”,且没有两个不同装置的结点用同一个字母表示,出口用“=”表示。

Bessie在这个迷宫中迷路了,她知道她在矩阵中的位置,将Bessie所在的那一块草地用“@”表示。求出Bessie需要移动到出口处的最短时间。

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

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

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

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

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

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

一个整数,表示Bessie到达终点所需的最短时间。
输入输出样例
输入 #1

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

输出 #1

3

此题有一个坑。若该地是一个传送装置,则能够走第二次,不然在某些情况下会到达不了出口。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;

const int maxn = 1e3 + 10;
struct node{
	int x, y;
	int step;
	node() {
		step = 0;
	}
};
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
char a[maxn][maxn];
bool vis[maxn][maxn];
int n, m;

bool judge(int x, int y) {
	if(x < 1 || y < 1 || x > n || y > m)
		return true;
	if(vis[x][y] || a[x][y] == '#')
		return true;
	return false;
}

void find(int &x, int &y) {
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			if(a[i][j] == a[x][y] && (i != x || j != y)) {
				x = i, y = j;
				return;
			}
		}
	}
}

void bfs() {
	node cur;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			if(a[i][j] == '@')
				cur.x = i, cur.y = j;
	queue<node>que;
	vis[cur.x][cur.y] = true;
	que.push(cur);
	while(!que.empty()) {
		cur = que.front();
		que.pop();
		if(a[cur.x][cur.y] == '=') {
			printf("%d", cur.step);
			return;
		}
		for(int i = 0; i < 4; i++) {
			int nx = cur.x + dx[i];
			int ny = cur.y + dy[i];
			if(judge(nx, ny))	continue;
			vis[nx][ny] = true;
			if(a[nx][ny] >= 'A' && a[nx][ny] <= 'Z') 
				vis[nx][ny] = false, find(nx, ny);
			node nex;
			nex.x = nx;
			nex.y = ny;
			nex.step = cur.step + 1;
			que.push(nex);
		}
	}
}

int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++)
		scanf("%s", a[i] + 1);
	bfs();
	return 0;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

P1825 [USACO11OPEN]Corn Maze S 【BFS】 的相关文章

  • HDOJ 题目3848 CC On The Tree(BFS)

    CC On The Tree Time Limit 2000 1000 MS Java Others Memory Limit 125536 65536 K Java Others Total Submission s 1684 Accep
  • C/C++无向图的遍历(bfs和dfs)

    描述 简单介绍一下图 xff0c 图就是由一些小圆点 xff08 称为顶点 xff09 和连接这些小圆点的直线 xff08 称为边 xff09 组成的 例如下图的由五个顶点 xff08 编号1 2 3 4 5 xff09 和五条边 xff0
  • 2020.2.22 排位赛 G - Bucket Brigade(BFS)

    Bucket Brigade 题面 题目分析 BFS模板题 代码 span class token macro property span class token directive keyword include span span cl
  • 肿瘤诊断(PAT)

    题目链接 https www patest cn contests gplt L3 004 一道很裸的bfs 一开始以为会超时 抱着试一试的心态交了一发竟然过了 include
  • Birdwatching 【Gym - 102501K】

    题目链接 抗疫期间 在家读如此长的题目容易烦躁hh 于是我就帮大伙读了 有N个点 M条边的无向图 我们给出图P是图G的一个衍生图 图G中的点和边图P中都有 但是图P中可能存在一些多余边 怎么说呢 就是图G中有a gt b gt c这样的边
  • 2019年第十届蓝桥杯省赛A组(C/C++组)迷宫(BFS)

    试题 D 迷宫 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从一个位置走到这 个它
  • 编程训练————岛屿数量(C++)

    岛屿数量 题目描述 主要思想 深度优先搜索 广度优先搜索 代码实现 深度优先搜索 广度优先搜索 题目描述 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向或竖直方向上
  • LeetCode:1625. 执行操作后字典序最小的字符串

    题目链接 1625 执行操作后字典序最小的字符串 力扣 LeetCode 题目信息 给你一个字符串 s 以及两个整数 a 和 b 其中 字符串 s 的长度为偶数 且仅由数字 0 到 9 组成 你可以在 s 上按任意顺序多次执行下面两个操作之
  • LeetCode第127题解析

    给定两个单词 beginWord 和 endWord 和一个字典 找到从 beginWord 到 endWord 的最短转换序列的长度 转换需遵循如下规则 每次转换只能改变一个字母 转换过程中的中间单词必须是字典中的单词 说明 如果不存在这
  • uva 1601 The Morning after Halloween code2

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 双向bfs 此题还可以单向bfs 见code1 1
  • Catowice City【Codeforces 1248 F】【BFS】

    Codeforces Round 594 Div 2 F 一开始是听闻有人说这是一道Tarjan好题 然后就点进来做了 但是想来想去 却想了个另类的法子 我们可以看到 如果N个人都要选择的话 那么每个人都只能是审判者 或者是参赛者 所以 我
  • 表示并解决给定图像的迷宫

    给定图像表示和解决迷宫的最佳方法是什么 给定一张 JPEG 图像 如上所示 读取它 将其解析为某种数据结构并解决迷宫的最佳方法是什么 我的第一直觉是逐像素读取图像并将其存储在布尔值列表 数组 中 True对于白色像素 以及False对于非白
  • 生成迷宫的好算法是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 假设你想要一个 N M 网格上的简单迷宫 有一条路径通过 并且有很多死胡同 但这看起来 正确 即就像有人手工制作的 没有太多微小的死胡同和所有这些
  • 有效的算法来检查二元迷宫是否可以通过限制移动来解决

    我遇到了一个生成二元维度迷宫的问题r x c 0 false对于阻塞的细胞和1 true免费手机 每个迷宫都应该是可解决的 一个人可以从 i j 到任一 i 1 j 向下 或 i j 1 正确的 求解器预计达到 r 1 c 1 最后一个单元
  • 在网格上编写随机路径从哪里开始比较合适?

    我不知道从哪里开始 我不是要求别人为我做这件事 但我不知道如何做 所以如果有人能指出我正确的方向 那就太好了 我无法使用谷歌找到任何东西 这就是我需要的 我需要创建一条从网格一侧到另一侧的路径 但不是以随机方式最短 我需要确保如果路径与路径
  • C++中迷宫的DFS最短路径

    我无法弄清楚如何准确地使其发挥作用 我正在尝试使用 DFS 获得到达目标的最短路径 我知道 BFS 更好 但有人要求我使用 DFS 正如您所看到的 我尝试对导致最终的所有堆栈进行比较以找到目标 但它不起作用 只有导致目标的第一个堆栈被打印
  • 如何使用列表在 python 上制作一个简单的 3x3 迷宫?

    我有这个项目 其中我必须制作一个基本的基于文 本的迷宫 冒险游戏 到目前为止 这是我的代码 但很奇怪 我希望它能够随时退出 并在输入不在选项中时显示 请选择可用方向 我知道我的代码是错误的 但我不知道该怎么办 有人可以帮我吗 谢谢 顺便说一
  • 3D 迷宫中的最短路径

    我正在尝试编写一个程序来使用递归查找 3D 迷宫中的最短路径 我能够编写找到穿过迷宫的随机路径的代码 但我想知道如何修改我的代码以找到最短路径 请注意 我想保留递归方法 有人可以提出解决方案吗 这是一个二维迷宫示例 s XXXX XX X
  • 将简单的单色绘图图像转换为二维文本数组

    我正在尝试开发一种算法 将简单的单线图像 即迷宫 转换为文本二维数组 例如 下面的图像 它将被转换为以下文本数组
  • python中不规则点之间的坐标列表

    想象一下 我们为 x 和 y 随机选择两个介于 0 到 100 之间的点 例如 95 7 35 6 现在使用简单的 pygame draw line 函数 我们可以轻松地在这些点之间绘制一条没有任何间隙的线 我的问题是 我们如何找到两点之间

随机推荐

  • Unity 音频从某一时间开始播放

    最近在做一个音乐类的项目 xff0c 遇到了音乐追帧问题 xff0c 记录一下 挺简单的一个问题 xff0c 在百度上搜了好久 xff0c 然后跟着看到的唯一一篇博客试了试 xff0c xff08 当时还以为终于找到了 xff09 xff0
  • GameFramework框架解读(AB打包、加载、热更流程 基于《Star Force》Demo)

    目录 1 单机模式 xff08 1 xff09 先打包进行设置 xff1a xff08 2 xff09 Start Build Resources 得到文件 2 热更 流程 xff08 1 xff09 修改第一步中的Resource 如图
  • Unity 改变物体顶点色

    扩展方法 xff1a Mesh的部分信息展示 xff1a Mesh挂上顶点采样shader xff1a
  • java对字符串数组进行排序

    import java util Arrays import java util Random public class Arrays o3 public static void main String args 自定义字符串 String
  • 判断某一点是否在包围盒内:Bounds.Contains

    蒙皮网格获取方法 xff1a SkinnedMeshRenderer xff1a m Bounds 61 colliderTran GetComponent lt SkinnedMeshRenderer gt sharedMesh boun
  • 关于协程记录一下

    void Start Print 61 Prints private IEnumerator Print void Update if Input GetKeyDown KeyCode S StartCoroutine Print if I
  • Android 10 安装兼容

    android exported 61 true
  • Unity 查Crash

    首先获得堆栈信息 xff0c AS 然后找Unity的NDK目录下的arm linux androideabi addr2line xff08 对应arm v7 xff09 xff0c 或者aarch64 linux android add
  • Unity TextMeshPro 毛边问题

    如图所示 xff1a 边缘像素透明度拉高了 结果是因为开了主相机的Post Processing 加低级抗锯齿 xff08 FXAA xff09 导致的 如图 xff1a 关闭Post Processing 或者关闭抗锯齿可解决 也可采用高
  • UnityWebRequest 本地读StreamingAssets写入persistentDataPath(坑啊)

    下文为自己以前写的 博客 xff0c 可谓打脸啊 xff08 知其然不知其所以然 xff09 以下为 Android 环境 本地读写数据 xff08 踩的坑 xff09 xff1a UnityWebRequest 加载本地文件的时候需要加
  • Application.logMessageReceived

    监听Unity的打印事件 xff0c 如常规打印 xff0c 报错等等 如下代码为自制的打印日志 xff1a List lt string gt mWriteTxt 61 new List lt string gt void OnEnabl
  • Unity编辑器篇(一)Scene界面

    xff08 一 xff09 xff0c 向屏幕中心发射一条射线 lastActiveSceneView 类似于 Game场景的相机 xff0c xff08 其实我也没搞懂是什么东西 xff09 Ray ray 61 SceneView la
  • 计蒜客-炮台实验

    蒜头君在玩一个战争模拟游戏 xff0c 他有高度为 1 2 3 ldots n1 2 3 n 的炮台各一个 xff0c 他需要把这 nn个炮台从左往右排成一行 xff0c 并且炮口都朝向右边 在这个游戏中 xff0c 所有炮台发射的炮弹会摧
  • Dockerfile详解超全

    Dockerfile详解 环境介绍指令介绍FROMMAINTAINERLABELADDCOPYEXPOSEENV在Dockerfile中使用变量的方式 RUNCMDRUN amp amp CMDENTRYPOINTVOLUMEUSERWOR
  • Debian8 修改root密码

    1 当系统启动进入GNU GRUB界面 xff0c 按esc停留在此页面 xff0c 按上下的方向键可以进行选择 2 选中要修改的系统 xff0c 按e进入编辑状态 xff0c 在linux开头的这一行末尾加上 init 61 bin ba
  • debian10 配置ntp服务

    debian10 配置ntp服务 1 安装ntp2 配置3 验证 服务器不能连外网 xff0c 内网中有一台授时服务器 xff0c 内网也搭建了debian10的本地镜像源 1 安装ntp apt install ntp 2 配置 sudo
  • STL priority_queue使用

    转自 xff1a http www cnblogs com lvpengms archive 2010 04 05 1704669 html 包含priority queue 的头文件是 lt queue gt priority queue
  • GNU 简单介绍(含glibc 源码下载)

    GNU是什么 xff1f 先放网址 xff1a https www gnu org GNU是一个自由软件操作系统 就是说 xff0c 它尊重其使用者的自由 GNU操作系统包括GNU软件包 xff08 专门由GNU工程发布的程序 xff09
  • P1591 阶乘数码 【高精】

    题目描述 求 n n n 中某个数码出现的次数 输入格式 第一行为 t t 10 t t leq 10 t t 10 xff0c 表示数据组数 接下来 ttt 行 xff0c 每行一个正整数 n n 1000 n n leq 1000 n
  • P1825 [USACO11OPEN]Corn Maze S 【BFS】

    题目描述 This past fall Farmer John took the cows to visit a corn maze But this wasn t just any corn maze it featured severa