P1825 [USACO11OPEN]Corn Maze S

news2024/11/18 15:51:50

题目描述

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?

输入格式

第一行:两个用空格隔开的整数 NN 和 MM。

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

输出格式

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

题意翻译

奶牛们去一个 N\times MN×M 玉米迷宫,2 \leq N \leq 300,2 \leq M \leq3002≤N≤300,2≤M≤300。

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

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

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

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

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

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

输入输出样例

输入 #1复制

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

输出 #1复制

3

说明/提示

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

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

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

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

1.这个题目我从全部WA然后大部分RE最后全部AC,真的是不容易啊(本来都不抱希望的了)。这是一个典型的BFS问题,是可以直接使用BFS模板去套用。

2.这个题目比较多的细节。首先就是传送门,译文说只有一对W,但是我后面下载了我测试错误的例子。是发现不止的,还有其他的。而且可能只有一个装置(这个不是很确定也是看题解有大佬说的)。关于传送门刚开始我想着把所有的列出来,但是一直没有AC几个,就试着和写题解的大佬一样直接去查找另外一个就ok,果真又AC了几个。但是有一个特别特别要注意的点,我是改了这个点之后,我才从52到100分的!就是我们在判别的时候,我们会搜到俩个,一个是我们本身进去的那一个,另外一个是要到的那一个。我们写if的时候不能写 i!=__&&j!=__。我们要写||,写&&的会出现万一装置在同一行或者同一列会出错。而||不会,因为只要有一个坐标不一样就说明是另外一个装置。

3.另外就是BFS开队列建议一定要把tail++这种类似自增语句改成tail=(tail+1)%MAXSIZE这样,我之前没改全是RE,因为我们不知道它的数组究竟要开多大,我们这么写是可以“废物利用”的。而主循环我们要写while(head!=tail),不要写成while(head<tail),因为tail可能已经走完一圈到前面了,会提前结束循环的。

4.在写的时候也一定要用数组标记走过,否则不会过。而且还会出现TLE的情况(不要问我怎么知道的)。

5.另外就是到传送门另一端的时候步数要+1,传送门不要标记!!!因为会出现以下情况,一定要去另一端转一转。再次回来再去出口。

 

 代码如下:

#include<stdio.h>
#define N 400
#include<ctype.h>
char str[N][N],book[N][N];
int n,m,start[2],end[2];
int head,tail;
struct node
{
	int x;
	int y;
	int s;
}cow[N*N+10];
int seek(struct node *a,char ch)
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			if(str[i][j]==ch&&(i!=(a->x)||j!=(a->y)))
			{
				a->x=i;a->y=j;return 0;
			}
		}
	}
	
}
int bfs()
{
	int i,j,tx,ty;
	int k[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
	head=tail=0;
	book[start[0]][start[1]]=1;
	cow[tail].x=start[0];
	cow[tail].y=start[1];
	cow[tail].s=0;
	tail=(tail+1)%(N*N+10);
	while(head!=tail)
	{
		for(i=0;i<4;i++)
		{
			tx=cow[head].x+k[i][0];
			ty=cow[head].y+k[i][1];
			if(tx>=0&&tx<n&&ty>=0&&ty<m&&str[tx][ty]!='#')
			{
				if(str[tx][ty]=='.'&&book[tx][ty]==0)
				{
					book[tx][ty]=1;
					cow[tail].x=tx;
					cow[tail].y=ty;
					cow[tail].s=cow[head].s+1;
					tail=(tail+1)%(N*N+10);
				}
				else if(str[tx][ty]>='A'&&str[tx][ty]<='Z')
				{
					cow[tail].x=tx;
					cow[tail].y=ty;
					cow[tail].s=cow[head].s+1;
					seek(&(cow[tail]),str[tx][ty]);
					tail=(tail+1)%(N*N+10);
				}
				else if(tx==end[0]&&ty==end[1])
				{
					return cow[head].s+1;
				}
			}
		}
		head=(head+1)%(N*N+10);
	}
}
int main()
{
	int i,j;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++)
		scanf("%s",str[i]);
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			if(str[i][j]=='@') 
			{
				start[0]=i;start[1]=j;
			}
			if(str[i][j]=='=')
			{
				end[0]=i;end[1]=j;
			}
		}
	}
	printf("%d\n",bfs());
	return 0;
}

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

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

相关文章

Docker安装镜像,并运行成为容器

1.Docker作用 一个项目中&#xff0c;部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等&#xff0c;这些服务部署时所需要的函数库、依赖项各不相同&#xff0c;甚至会有冲突。给部署带来了极大的困难。 而Docker确巧妙的解决了这些问题, Docker为了解决依赖的兼容问题的…

关于两种单菌种发酵的豆瓣酱代谢组学方面差异研究

生活离不开柴米油盐酱醋茶&#xff0c;其中酱油是中国传统的调味品&#xff0c;主要是由大豆经过发酵酿造而成。酱油由酱演变而来&#xff0c;早在三千多年前&#xff0c;中国就有制作酱的记载了。 本期百趣代谢组学文献分享为大家分享的文献是百趣生物协助客户发表的关于两种…

Git cherry-pick

Git cherry-pick 当有多个分支&#xff0c;想将一个分支 A 的提交合并到另一个分支 B 一&#xff1a;将分支A的所有提交合并到分支B&#xff0c;执行合并即可 二&#xff1a;将分支A 的某一次提交合并到分支 B&#xff0c;需要使用 git cherry-pick commit 命令 如下图&#…

随机森林-sklearn

随机森林 1.概述 1.1 集成算法概述 本身并不是一个单独的机器学习算法&#xff0c;而是通过在数据上构建多个模型&#xff0c;集成所有模型的建模结果。以此来获得最好的结果。 集成算法的目标&#xff1a; 集成算法会考虑多个评估器的建模结果&#xff0c;汇总之后得到一个…

物联网低功耗蓝牙核心配置技术: 赋能智能家居和智能工业场景

蓝牙我们都不陌生&#xff0c;早已成为深入我们生活的一项科技。不过&#xff0c;我们所知所用的还只是蓝牙的一部分。而蓝牙目前作为物联网中的一项重要通信技术&#xff0c;其应用还远远不止这些&#xff0c;今天就为大家讲讲蓝牙技术中的低功耗技术的应用及分类。 蓝牙低功耗…

原神私服搭建教程 (最新版)

搭建教程 1.准备阶段 1.请先确保电脑内有这些安装环境&#xff0c;否则私服无法运行&#xff01;&#xff01;&#xff01; MongoDB Python3.8 java17 mitmproxy 没有请在群文件下载安装环境&#xff0c;安装即可。特别强调&#xff1a;java17直接放在C:\Program Files目录下即…

初识Kubernetes:(4)Kubernetes实战入门

初识Kubernetes&#xff1a;&#xff08;4&#xff09;Kubernetes实战入门1 前言2 Namespace2.1 概述2.2 应用示例3 Pod3.1 概述3.2 语法及应用示例1 前言 介绍如何在kubernetes集群中部署一个Nginx服务&#xff0c;并且能够对其访问。 2 Namespace 2.1 概述 Namespace是ku…

写给Java程序员的GRPC入门系列(2)

点击上方GRPC专栏看完整系列 文章目录Abstract前置依赖本文初始状态编写protobuffer文件生成代码下一步Abstract 网上有很多GRPC的例子&#xff0c;但是却没有能够写给普通Java开发人员手把手入门少走弯路的教程。 本教程保证按照步骤一步步来你就可以完成GRPC从0到1的构建。 …

模型驱动PDR、数据驱动PDR实验效果对比

本学期的室内导航位置服务课程结束了&#xff0c;最后有一个结课作业做了一些工作&#xff0c;在这里分享给大家&#xff0c;同时也是自己的一个记录。 主要内容包括以下四个方面&#xff1a; 模型驱动PDR数据驱动PDR实验效果对比模型驱动PDR测试效果数据驱动PDR-RoNIN官方预训…

JSP ssh相亲网站系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh相亲系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发 。开发环境为TOMCAT7.0,Myeclip…

MergeTree原理之存储

我们都知道在MergeTree中数据是按列存储的&#xff0c;但是具体到存储的细节、以及如何工作的&#xff0c;都存在很多疑问。数据存储&#xff0c;就好比一本书中的文字&#xff0c;在排版时&#xff0c;绝不会密密麻麻地把文字堆满&#xff0c;这样会导致难以阅读。更为优雅的做…

Git学习:各阶段回退方法

文章目录一、问题背景二、解决方式1. 回退情况1&#xff1a;文件在工作区进行回退2. 回退情况2&#xff1a;文件在暂存区进行回退3. 回退情况3&#xff1a;文件在本地仓库进行回退4. 回退情况4&#xff1a;文件已经在远程仓库中一、问题背景 Git 是分布式的软件管理系统。在把…

代码随想录拓展day4 205. 同构字符串;1002. 查找常用字符;925.长按键入;844.比较含退格的字符串

代码随想录拓展day4 205. 同构字符串&#xff1b;1002. 查找常用字符&#xff1b;925.长按键入&#xff1b;844.比较含退格的字符串 哈希表和字符串的一些应用&#xff0c;放到一起了。 同构字符串 https://leetcode.cn/problems/isomorphic-strings/description/ 刚开始以…

spring boot:集成支付宝(沙箱环境)(spring boot 2.4.0 / wap/h5方式 )

一&#xff0c;配置支付宝沙箱环境: 1,沙箱的地址: 登录 - 支付宝 也可以登录后&#xff0c;从控制台点击 研发服务 进入 2&#xff0c;下载开发助手:并生成密钥 从这个页面&#xff0c;按自己所在的平台下载&#xff0c; 当前支持 windows,macos 开发助手简介 &#xf…

自定义Tango Control设备服务在Ubuntu中的测试

文章目录环境create a device classcompile the device classregister the devicestart the deviceexplore the device故障问题解决参考继续上一篇&#xff1a;https://blog.csdn.net/woshigaowei5146/article/details/128443892?spm1001.2014.3001.5501 环境 虚拟机&#xf…

布隆过滤器 以及缓存穿透问题

1. 前言 今天从客观的角度来分析下&#xff0c;什么是缓存穿透&#xff0c;什么是布隆过滤器&#xff0c;布隆过滤器是如何解决缓存穿透的。 2. 适合人群 对布隆过滤器不熟悉的人对Redis 缓存穿透不熟悉的人 3. 开始 3.1 什么是缓存穿透 其实通过上图我们可以知道&#xff0…

(七)Filter

Filter 表示过滤器&#xff0c;是JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控制、统一编码处理、敏感字符处理等等..一、Filte…

彻底理解Redis持久化

前言 大家都知道Redis一个内存数据库,它支持2种持久化方式&#xff1a;RDB(Snapshot 内存快照) &#xff0c;AOF(append only file)。持久化功能将内存中的数据同步到磁盘来避免Redis发生异常导致数据丢失的情况。当Redis实例重启时&#xff0c;即可利用之前持久化的文件实现数…

软件项目管理教程

软件项目管理 1. 软件项目管理 1.1 概述 概念 项目是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力 软件项目特征 目标性 相关性 周期性 独特性 没有完全一样的项目”&#xff0c;项目的这种独特性对实际项目管理有非常重要的指导意义&#xff0c;因此…

跨境电商日本市场再创纪录,亚马逊失去流量第一位置

从跨境电商服务行业市场分析人员拿到的近期的各平台的销售数据和相关工作总结来看&#xff0c;美国市场微热&#xff0c;而反观欧洲市场则有些遇冷。 此外&#xff0c;近几年的疫情及各国相关政策并未影响到跨境电商市场的整体大好趋势&#xff0c;而伴随着疫情逐渐被控制&…