洛谷: P1825 [USACO11OPEN] Corn Maze S

原题链接:P1825 [USACO11OPEN] Corn Maze S - 洛谷

题目描述

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+1 行:第 i+1 行描述了迷宫中的第 i 行的情况(共有M个字符,每个字符中间没有空格)。

输出格式

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

隐藏翻译

题意翻译

奶牛们去一个 N×M 玉米迷宫,2≤N≤300,2≤M≤300。

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

如果一头奶牛处在这个装置的起点或者终点,这头奶牛就必须使用这个装置,奶牛在传送过后不会立刻进行第二次传送,即不会卡在传送装置的起点和终点之间来回传送。

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

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

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

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

输入输出样例

输入 #1复制

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

输出 #1复制

3

        该题是一道bfs(广度优先搜索的题),因为广度优先搜索第一条到达终点的路径即为最短的路径。在该题中加入了一个很新颖的设定——传送门。用从A到Z的一对大写字母来表示传送门,可以从任意一端传送到另一端,并且传送的过程中是不消耗时间的。这里有一个大坑点。题目说了在进行一次传送过后不会“立刻”进行第二次传送。这个“立刻”很有说法。题目的意思是不能出现刚传过去就又传过来的这一种反复传送的情况。但是可以在传过去走一步之后在踏入传送门。所以,在标记状态时,要把起点的状态设置为已标记,中的状态不用标记,就可以符合题意。

        在记录传送门时,我用了一个结构体数组a,b;数组大小为26。数组下标0~25分别代表大写字母A~Z。分别存放传送门两端的坐标。可以将先遍历到的传送门的一个点当作起点,另一个即为终点。然后在输入用例时处理传送门的两端的坐标,先出现的传送门坐标放在数组a里,另一个则放在数组b里。在bfs中遍历时,如果遇到了传送门就进行特殊处理,只标记传送门的起点状态。

        总而言之,该题的主要难点就是对于传送门的处理,以及对题意的理解,做这种题还是要细心一点的。

具体代码如下:

#include <iostream>
#include <queue>
#include <string>
using namespace std;struct node{int x,y;
}a[26],b[26];//分别存放传送门两端的坐标
struct nn{int x,y,step;
};int n,m;
int sx,sy,ex,ey;
int dict[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int arr[26];
char grid[310][310];
bool vis[310][310];int bfs(){queue<nn> q;q.push({sx,sy,0});vis[sx][sy] = true;while (!q.empty()){nn now = q.front();q.pop();int x = now.x;int y = now.y;int step = now.step;for (int i = 0;i < 4;++i){int xx = x + dict[i][0];int yy = y + dict[i][1];if (xx < 0 || xx >= n || yy < 0 || yy >= m)continue;if (grid[xx][yy] == '#' || vis[xx][yy])continue;//到达终点就结束bfsif (xx == ex && yy == ey){return step + 1;}//处理遇到传送门的情况if (grid[xx][yy] >= 'A' && grid[xx][yy] <= 'Z'){int num = grid[xx][yy] - 'A';//标记传送门起点的状态为已标记vis[xx][yy] = true;if (a[num].x == xx && a[num].y == yy){xx = b[num].x;yy = b[num].y;}else{xx = a[num].x;yy = a[num].y;}q.push({xx,yy,step + 1});continue;}vis[xx][yy] = true;q.push({xx,yy,step + 1});}}return 0;
}
int main()
{cin>>n>>m;for (int i = 0;i < n;++i){for (int j = 0;j < m;++j){cin>>grid[i][j];//处理传送门两端的坐标if (grid[i][j] >= 'A' && grid[i][j] <= 'Z'){int num = grid[i][j] - 'A';arr[num]++;if (arr[num] == 1){a[num] = {i,j};}else{b[num] = {i,j};}}//记录起点和终点的坐标if (grid[i][j] == '@'){sx = i;sy = j;}if (grid[i][j] == '='){ex = i;ey = j;}}}int step = bfs();cout<<step;return 0;
}

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

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

相关文章

探秘DeepSeek:开源AI领域的创新先锋

一、引言 在人工智能迅猛发展的当下&#xff0c;众多先进的模型如雨后春笋般涌现&#xff0c;而 DeepSeek 无疑是其中备受瞩目的一颗新星。它以独特的技术优势和广泛的应用场景&#xff0c;在 AI 领域崭露头角。 二、DeepSeek 的诞生与背景 DeepSeek 由来自广东省的中国企业…

Spring Boot启动流程

1. 启动类与main方法 入口点&#xff1a;Spring Boot应用通常有一个带有SpringBootApplication注解的主类&#xff0c;并包含一个public static void main(String[] args)方法。 SpringBootApplication是一个组合注解&#xff0c;包含了&#xff1a; Configuration: 标记该类为…

设计模式——设计模式理念

文章目录 参考&#xff1a;[设计模式——设计模式理念](https://mp.weixin.qq.com/s/IEduZFF6SaeAthWFFV6zKQ)参考&#xff1a;[设计模式——工厂方法模式](https://mp.weixin.qq.com/s/7tKIPtjvDxDJm4uFnqGsgQ)参考&#xff1a;[设计模式——抽象工厂模式](https://mp.weixin.…

Android 16开发实战指南|锁屏交互+Vulkan优化全解析

一、环境搭建与项目初始化 1. 安装Android Studio Ladybug 下载地址:Android Studio官网关键配置: # 安装后立即更新SDK SDK Manager → SDK Platforms → 安装Android 16 (Preview) SDK Manager → SDK Tools → 更新Android SDK Build-Tools至34.0.0 # 通过命令行安装SDK组…

selenium应用测试场景

Selenium 是主流的 Web 自动化测试框架&#xff0c;主要用于基于浏览器的 Web 应用测试。以下是 Selenium 的典型测试场景和适用场景&#xff0c;以及与 Appium 的对比&#xff1a; 1. Selenium 的核心测试场景 (1) Web 功能测试&#xff08;Functional Testing&#xff09; 表…

[Vue]生命周期

在编程领域生命周期指的即一个对象从创建到销毁的过程。 Vue的生命周期大概分为四个阶段&#xff1a; 创建阶段 在该阶段&#xff0c;vue的主要工作是为渲染模板做准备工作。比如处理data中的数据&#xff0c;使其变为响应式数据。在html中普通的数据往往不具备响应式等一系列…

低代码平台,智慧城市建设的加速器

随着城市数字化进程加速&#xff0c;智慧停车、智慧交通、城市数据治理等领域对技术敏捷性和开发效率的需求日益凸显。低代码平台凭借其可视化开发、模块化设计和快速部署能力&#xff0c;正在成为推动城市治理智能化升级的核心工具。本文将通过低代码在智慧城市建设上应用的展…

14 配置Hadoop集群-配置历史和日志服务

第一课时 一、导入 前面的课程我们搭建了hadoop集群&#xff0c;并成功启动了它&#xff0c;接下来我们看看如何去使用集群。 测试的内容包括&#xff1a;1.上传文件&#xff0c;2.下载文件&#xff0c;3.运行程序 二、授新 &#xff08;一&#xff09;配置运行任务的历史服务器…

0102-web架构网站搭建-基础入门-网络安全

文章目录 1. 常规2 站库分离3 前后端分离4 集成环境5 docker6 分配站结语 1. 常规 结构&#xff1a;源码数据都在同服务器 影响&#xff1a;无&#xff0c;常规安全测试手法 2 站库分离 结构&#xff1a;源码和数据库不在同服务器 存储&#xff1a;其他服务器上数据库或者…

【分布式系统】-2-GFS

MIT的【分布式系统课程】学习记录 内容纯属个人学习过程中的笔记记录&#xff0c;如果有侵权现象请留言&#xff0c;会立刻删除 分布式存储系统的难点&#xff1a; 设计大型存储系统的出发点&#xff1a;利用数百台计算机资源同时完成大量工作&#xff0c;达到性能加成 如何做…

黑盒测试的场景法(能对项目业务进行设计测试点)

定义: 通过运用场景来对系统的功能点或业务流程的描述&#xff0c;设计用例遍历场景&#xff0c;验证软件系统功能的正确性从而提高测试效果的一种方法。 场景法一般包含基本流和备用流。 基本流:软件功能的正确流程&#xff0c;通常一个业务只存在一个基本流且基本流有一个…

22 安装第三方包

一、什么是第三方包 在 Python 的世界里&#xff0c;包就像是一个个功能强大的工具箱&#xff0c;它将多个 Python 模块收纳其中&#xff0c;而每个模块又蕴含着丰富多样的具体功能。可以说&#xff0c;一个包就是一系列同类功能的集合体&#xff0c;它们就像紧密协作的团队&a…

MyBatisPlus不等于如何使用

在 MyBatis Plus 中&#xff0c;ne 方法用于构建不等于条件的 SQL 查询。以下是 ne 方法的详细用法&#xff1a; 基本用法 ne 方法可以用于 QueryWrapper 或 LambdaQueryWrapper 中&#xff0c;用于指定某个字段的值不等于指定的值。它对应于 SQL 中的 ! 或 <> 操作符。 …

[学术][人工智能] 001_什么是神经网络?

神经网络是一种模拟生物神经系统的计算模型&#xff0c;具有广泛的应用和重要的研究价值。以下将从不同方面详细介绍神经网络。 一、神经网络的发展历程 20 世纪 60 年代&#xff0c;Hubel 和 Wiesel 在研究猫脑皮层中发现了用于局部敏感和方向选择的神经元结构&#xff0c;卷积…

Unity3D仿星露谷物语开发32之地面属性决定角色动作

1、目标 根据地面属性&#xff08;diggable, canDropItem, canPlaceFurniture, isPath, isNPCObstacle&#xff09;决定角色进行何种操作。比如没有canDropItem属性的地面&#xff0c;则不能放置物体。 2、优化保存Item数据 PS&#xff1a;这个是对已有代码的优化&#xff0…

031-valgrind

valgrind 以下是从原理到代码实现、参数优化及结果分析的Valgrind技术调研报告&#xff0c;结合C示例和可视化工具使用说明&#xff1a; 一、Valgrind核心原理与架构 1.1 系统架构 #mermaid-svg-xIgV3fg90dGhEEq4 {font-family:"trebuchet ms",verdana,arial,sans-…

C/C++蓝桥杯算法真题打卡(Day12)

一、P8752 [蓝桥杯 2021 省 B2] 特殊年份 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std; int cnt;int main() {int i1;while(i<5){int num;cin>>num;string string_numto_string(num);if(string_num[0]string_num[2]&&str…

MySQL 复制与主从架构(Master-Slave)

MySQL 复制与主从架构&#xff08;Master-Slave&#xff09; MySQL 复制与主从架构是数据库高可用和负载均衡的重要手段。通过复制数据到多个从服务器&#xff0c;既可以实现数据冗余备份&#xff0c;又能分担查询压力&#xff0c;提升系统整体性能与容错能力。本文将详细介绍…

《大模型部署》——ollama下载及大模型本地部署(详细快速部署)

ollama Ollama 是一款开源跨平台的大语言模型&#xff08;LLM&#xff09;运行工具&#xff0c;旨在简化本地部署和管理 AI 模型的流程。 下载ollama 进入官网下载https://ollama.com/ 选择需要的系统下载 下载完成后直接进行安装 下载大模型 选择想要部署的模型&#…

Java关于包和final

什么是包&#xff1f; 包就是文件夹。用来管理等各种不同功能的java类&#xff0c;方便后期代码维护 包名的规则&#xff1a;公司域名反写包的作用&#xff0c;需要全部英文小写&#xff0c;见名知意。例如&#xff1a;com.pdsu.domain package com.pdsu.demain;public class…