当前位置:网站首页>信息学奥赛一本通(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;
}边栏推荐
- golang 源码分析:juju/ratelimit
- 【LeetCode】1161. 最大层内元素和
- AI Scientist: Automatically discover hidden state variables of physical systems
- 二丙二醇甲醚醋酸酯
- Geoip2 - golang golang source code analysis
- LeetCode 622 设计循环队列[数组 队列] HERODING的LeetCode之路
- [安洵杯 2019]easy_web
- Caldera(一)配置完成的虚拟机镜像及admin身份简单使用
- ABAP语法小复习
- Leetcode刷题——单调栈问题(739每日温度问题、496下一个更大元素I、503下一个更大元素 II)
猜你喜欢

SCANIA SCANIA OTL tag is introduced

unittest自动化测试框架总结

Office2021 安装MathType
The time series database has been developed for 5 years. What problem does it need to solve?

Kali命令ifconfig报错command not found

SQL 入门之第一讲——MySQL 8.0.29安装教程(windows 64位)

Parse common methods in the Collection interface that are overridden by subclasses

Five data structures of Redis and their corresponding usage scenarios

J9数字货币论:识别Web3新的稀缺性:开源开发者

译出我精彩 | 7月墨力翻译计划获奖名单公布
随机推荐
What is a Field Service Management System (FSM)?what is the benefit?
Lvm逻辑卷
太魔人招新啦|快来加入我们吧!
第七章 噪声
7月29-31 | APACHECON ASIA 2022
Thread线程类基本使用(下)
Translate My Wonderful | July Moli Translation Program Winners Announced
Three.js入门
笑话:如果你在河边等待得足够久,你会看到你的敌人的尸体漂过,是怎么翻译出来的?
解析Collection接口中的常用的被实现子类重写的方法
使用位运算实现加减乘除(+、-、*、/)及比较器的用法
ShardingSphere-proxy +PostgreSQL实现读写分离(静态策略)
golang 源码分析:uber-go/ratelimit
es 官方诊断工具
golang source code analysis: uber-go/ratelimit
golang 源码分析:juju/ratelimit
Flutter自带国际化适配自动生成方案
牛客题目——滑动窗口的最大值、矩阵最长递增路径、顺时针旋转矩阵、接雨水问题
Fiddle设置接口数据用指定工具查看;Sublime Text设置json数据格式化转换
golang源码分析:time/rate