洛谷P1825-[USACO11OPEN]Corn Maze S(BFS)

简介: 洛谷P1825-[USACO11OPEN]Corn Maze S(BFS)

题目描述:


去年秋天,奶牛们去参观了一个玉米迷宫,迷宫里有一些传送装置,可以将奶牛从一点到另一点进行瞬间转移。这些装置可以双向使用:一头奶牛可以从这个装置的起点立即到此装置的终点,同时也可以从终点出发,到达这个装置的起点。如果一头奶牛处在这个装置的起点或者终点,这头奶牛就必须使用这个装置。


玉米迷宫的外部完全被玉米田包围,除了唯一的一个出口。


这个迷宫可以表示为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到达终点所需的最短时间。



样例输入:


5 6


###=##


#.W.##


#.####


#.@W##


######  


样例输出:


3


AC Code:


#include<bits/stdc++.h>
using namespace std;
#define N 510
char s[N][N];//存入地图 
int a[N][N];//对地图进行相应的转换 
bool vis[N][N];//标记数组 
int n,m,sx,sy,ex,ey,mx,my,xx,yy,head,tail;
int dx[]={0,0,1,-1};//两个方向数组 
int dy[]={1,-1,0,0};
struct node {
  int x,y,step;
}q[N*N];//模拟队列 
void find(int x,int y) {
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=m;j++) {
      if(!(i==x&&j==y)) {//搜索一个传送门对应的另一个传送门的位置 
        if(a[i][j]==a[x][y]) {
          xx=i;//获取另一个传送门的坐标 
          yy=j;
          return ;
        }
      }
    }
  }
}
int main() {
  scanf("%d %d",&n,&m);
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=m;j++) {
      scanf(" %c",&s[i][j]);//%前面的空格确保地图完整输入
      //将可以走的地方都用a数组标记为1,不能走的标记为0 
      if(s[i][j]=='.') {//草地可以走 
        a[i][j]=1;
      }else if(s[i][j]=='@') {//起点可以走 
        sx=i;
        sy=j;
        a[i][j]=1;
      }else if(s[i][j]=='=') {//出口可以走 
        ex=i;
        ey=j;
        a[i][j]=1;
      }else if(s[i][j]>='A'&&s[i][j]<='Z') {//传送门可以走 
        a[i][j]=s[i][j];
      }else {//玉米格子不能走 
        a[i][j]=0;
      }
    }
  }
  memset(vis,false,sizeof(vis));//清空标记数组 
  vis[sx][sy]=true;//对起点进行标记 
  head=tail=1;//队头队尾初始化 
  q[head].x=sx;//起点入队 
  q[head].y=sy;
  q[head].step=0;//步数为0 
  tail++;//队尾向后移动一格 
  while(head<tail) {//保证队列不为空 
    if(a[q[head].x][q[head].y]>='A'&&a[q[head].x][q[head].y]<='Z') {//判断此时是否走到传送门 
      find(q[head].x,q[head].y);//寻找另一个传送门的坐标 
      q[head].x=xx;//位置坐标更新为另一个传送门 
      q[head].y=yy;
    }
    for(int i=0;i<4;i++) {//四个方向搜索 
      int tx=q[head].x+dx[i];
      int ty=q[head].y+dy[i];
      //不越界,这个点可以走,并且没有被访问过 
      if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]!=0&&vis[tx][ty]==false) {
        vis[tx][ty]=true;//标记该点 
        q[tail].x=tx;//该点入队 
        q[tail].y=ty;
        q[tail].step=q[head].step+1;//步数+1 
        if(tx==ex&&ty==ey) {//走到出口 
          printf("%d\n",q[tail].step);//输出此时的步数 
          return 0;//直接返回 
        }
        tail++;//新的点入队,队尾向后移动一格 
      }
    }
    head++;//没有走到出口,队头向后移动一格,继续下一个点的搜索 
  }
  return 0;
}

 


相关文章
|
SQL 数据可视化 Java
DBeaver数据库可视化工具
DBeaver数据库可视化工具
752 3
|
9月前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
476 83
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
365 0
|
机器学习/深度学习 存储
深入理解SVM中的核函数及其应用
深入理解SVM中的核函数及其应用
635 83
|
11月前
|
弹性计算 Java 数据库
Web应用上云经典架构实战
本课程详细介绍了Web应用上云的经典架构实战,涵盖前期准备、配置ALB、创建服务器组和监听、验证ECS公网能力、环境配置(JDK、Maven、Node、Git)、下载并运行若依框架、操作第二台ECS以及验证高可用性。通过具体步骤和命令,帮助学员快速掌握云上部署的全流程。
285 1
|
关系型数据库 MySQL 网络安全
有关使用Navicat 无法成功连接腾讯云服务器上Mysql的问题解决
这篇文章提供了解决Navicat无法连接腾讯云服务器上MySQL问题的步骤,包括调整防火墙设置、更新MySQL权限和检查远程连接配置。
有关使用Navicat 无法成功连接腾讯云服务器上Mysql的问题解决
|
JavaScript 开发工具
vite如何打包vue3插件为JSSDK
【9月更文挑战第10天】以下是使用 Vite 打包 Vue 3 插件为 JS SDK 的步骤:首先通过 `npm init vite-plugin-sdk --template vue` 创建 Vue 3 项目并进入项目目录 `cd vite-plugin-sdk`。接着,在 `src` 目录下创建插件文件(如 `myPlugin.js`),并在 `main.js` 中引入和使用该插件。然后,修改 `vite.config.js` 文件以配置打包选项。最后,运行 `npm run build` 进行打包,生成的 `my-plugin-sdk.js` 即为 JS SDK,可在其他项目中引入使用。
654 6
|
人工智能 人机交互 智能硬件
从大模型的原理到提示词优化
本文介绍了大语言模型(LLM)的基本概念及其工作原理,重点探讨了AI提示词(Prompt)的重要性和几种有效技巧,包括角色设定、One-shot/Few-shot、任务拆解和思维链。通过实例解析,展示了如何利用这些技巧提升LLM的输出质量和准确性,强调了提供高质量上下文信息对优化LLM表现的关键作用。
981 0
|
存储 人工智能 数据挖掘
使用GGML和LangChain在CPU上运行量化的llama2
Meta AI 在本周二发布了最新一代开源大模型 Llama 2。对比于今年 2 月发布的 Llama 1,训练所用的 token 翻了一倍,已经达到了 2 万亿,对于使用大模型最重要的上下文长度限制,Llama 2 也翻了一倍。
1123 1
使用GGML和LangChain在CPU上运行量化的llama2