当前位置:网站首页>信息学奥赛一本通(1256:献给阿尔吉侬的花束)
信息学奥赛一本通(1256:献给阿尔吉侬的花束)
2022-08-02 20:02:00 【橙子教师】
1256:献给阿尔吉侬的花束
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 7427 通过数: 3067
【题目描述】
阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。
迷宫用一个R×C的字符矩阵来表示。字符S表示阿尔吉侬所在的位置,字符E表示奶酪所在的位置,字符#表示墙壁,字符.表示可以通行。阿尔吉侬在1个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。
【输入】
第一行是一个正整数T(1 ≤ T ≤ 10),表示一共有T组数据。
每一组数据的第一行包含了两个用空格分开的正整数R和C(2 ≤ R, C ≤ 200),表示地图是一个R×C的矩阵。
接下来的R行描述了地图的具体内容,每一行包含了C个字符。字符含义如题目描述中所述。保证有且仅有一个S和E。
【输出】
对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。每组数据的输出结果占一行。
【输入样例】
3
3 4
.S..
###.
..E.
3 4
.S..
.E..
....
3 4
.S..
####
..E.【输出样例】
5
1
oop!【分析】
典型的迷宫问题,可以用bfs求解,四个方向延伸。
【参考代码】
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int N=210;
struct point
{
int x; // 坐标
int y;
int step; // 步数
};
int m,n; //地图尺寸
char a[N][N]; //地图
int vis[N][N]; //访问数组
int dx[4]={0,1,0,-1}; //方向数组,右,下,左,上
int dy[4]={1,0,-1,0};
int startx,starty; //起始点坐标
int p,q; //终点坐标
int flag;
void bfs()
{
queue <point> r; // 申请队列
point s; // 初始化队列
s.x=startx;
s.y=starty;
s.step=0;
r.push(s); // 起点入队
vis[startx][starty]=1;
while(!r.empty()) // 判断队列是否为空
{
point t,tmp;
t=r.front();
if(t.x==p && t.y==q) // 判断是否是终点
{
flag=true;
cout << t.step << endl;
return;
}
for(int k=0;k<4;k++) // 四个方向
{
tmp.x=t.x+dx[k];
tmp.y=t.y+dy[k];
if(tmp.x>=1 && tmp.x<=m && tmp.y>=1 && tmp.y<=n && a[tmp.x][tmp.y]=='.' && vis[tmp.x][tmp.y]==0) // 判断能不能走
{
//入队处理
tmp.step=t.step+1;
r.push(tmp); //入队
vis[tmp.x][tmp.y]=1; //标记
}
}
r.pop(); //拓展完了,需要将队首元素出队
}
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
flag=0;
cin >> m >> n;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
cin >> a[i][j]; // '.'表示空地,'#'表示障碍物
if(a[i][j]=='S')
{
startx=i;
starty=j;
a[i][j]='.';
}
if(a[i][j]=='E')
{
p=i;
q=j;
a[i][j]='.';
}
}
}
vis[startx][starty]=1;
bfs();
if(!flag)
cout << "oop!" << endl;
}
return 0;
}边栏推荐
- 一次线上事故,我顿悟了异步的精髓
- TodoList案例
- PG 之 SQL执行计划
- Caldera(一)配置完成的虚拟机镜像及admin身份简单使用
- 【手撕AHB-APB Bridge】~ AMBA总线 之 APB
- 基本语法(三)
- SQL 嵌套 N 层太长太难写怎么办?
- 「 每日一练,快乐水题 」1374. 生成每种字符都是奇数个的字符串
- What is a Field Service Management System (FSM)?what is the benefit?
- Parse the commonly used methods in the List interface that are overridden by subclasses
猜你喜欢

In action: 10 ways to implement delayed tasks, with code!

MySQL安装时一直卡在starting server

J9 Digital Currency Theory: Identifying Web3's New Scarcity: Open Source Developers

Caldera(二)高级实战

线程安全(上)

LM小型可编程控制器软件(基于CoDeSys)笔记二十五:plc的数据存储区(数字量输入通道部分)

4KMILES加入艾盛集团,以更强劲的数字商务能力,加速中国跨境电商的全域全效增长

即时通讯开发移动端网络短连接的优化手段

实战:10 种实现延迟任务的方法,附代码!

Triacetin是什么化学材料
随机推荐
V - memo new instructions
golang源码分析之geoip2-golang
Electron User Guide Beginning Experience
golang源码分析:time/rate
[AnXun cup 2019] easy_web
如何解决图像分类中的类别不均衡问题?不妨试试分开学习表征和分类器
笑话:如果你在河边等待得足够久,你会看到你的敌人的尸体漂过,是怎么翻译出来的?
牛客题目——滑动窗口的最大值、矩阵最长递增路径、顺时针旋转矩阵、接雨水问题
J9 digital theory: the Internet across chain bridge has what effect?
日志框架学习
力扣每日一题-第46天-344. 反转字符串
Meta 与苹果的元宇宙碰撞
Geoserver+mysql+openlayers2
一些不错的博主
基于 outline 实现头像剪裁以及预览
Qt提升自定义控件,找不到头文件
Three.js入门
技术分享 | Apache Linkis 快速集成网页IDE工具 Scriptis
美国爱荷华州立大学| Improving Distantly Supervised Relation Extraction by Natural Language Inference(通过自然语言推理改进远程监督关系提取)
Soft Exam ----- UML Design and Analysis (Part 2)