AcWing 1101.献给阿尔吉侬的花束
阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。
今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。
现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。
迷宫用一个 R×C 的字符矩阵来表示。
字符 S 表示阿尔吉侬所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示墙壁,字符 . 表示可以通行。
阿尔吉侬在 1 个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。
输入格式
第一行是一个正整数 T,表示一共有 T 组数据。
每一组数据的第一行包含了两个用空格分开的正整数 R 和 C,表示地图是一个 R×C 的矩阵。
接下来的 R 行描述了地图的具体内容,每一行包含了 C 个字符。字符含义如题目描述中所述。保证有且仅有一个 S 和 E。
输出格式
对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。
若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。
每组数据的输出结果占一行。
数据范围
1<T≤10,
2≤R,C≤200
解题思路:将起点的坐标入队列,终点的坐标记着,然后把从起点往上下左右走,能走的入队列(有墙的不能走),最后输出终点坐标的值,如果等于-1,说明走不到这个点输出oop!,不等于-1就直接输出。
代码如下
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
vector<int>line;//没用
struct node{
int x3,y3;
};
int p[205][205];
queue<node>q;
int b[4][4]={{0,1},{1,0},{-1,0},{0,-1}};//上下左右四个方向
int qdx,qdy,zdx,zdy;
char a[205][205];
void prin(int n,int m){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){//记下起点的下标
qdx=i;
qdy=j;
}
if(a[i][j]=='E'){//记下终点的下标
zdx=i;
zdy=j;
}
}
}
}
int main()
{
int n,r;
cin>>n;
int x,y;
for(r=1;r<=n;r++){
cin>>x>>y;
prin(x,y);
memset(p,-1,sizeof p);//将p里的值都置为-1
q.push({qdx,qdy});//把起点的坐标入队列
p[qdx][qdy]=0;
while(q.size()){
int i;
node k=q.front();//初始化p数组置为-1
q.pop();
for(i=0;i<4;i++){
int j,k1;
j=k.x3+b[i][0];
k1=k.y3+b[i][1];//四个方向
if(j<1||j>x||k1<1||k1>y||p[j][k1]!=-1||a[j][k1]=='#') continue;//越界和碰到墙的情况
q.push({j,k1});//把符合的入队列
p[j][k1]=p[k.x3][k.y3]+1;//记下他到p[j][k1]需要的步数
}
}
if(p[zdx][zdy]!=-1){
cout<<p[zdx][zdy]<<endl;
}else{
cout<<"oop!"<<endl;//等于-1说明走不到这里
}
return 0;
}