AcWing 1101.献给阿尔吉侬的花束 BFS解

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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是NBA历史前50大巨星的排名: 1. 迈克尔·乔丹(Michael Jordan) 2. 拉里·伯德(Larry Bird) 3. 魔术师约翰逊(Magic Johnson) 4. 比尔·拉塞尔(Bill Russell) 5. 奥斯卡·罗伯特森(Oscar Robertson) 6. 威尔特·张伯伦(Wilt Chamberlain) 7. 科比·布莱恩特(Kobe Bryant) 8. 蒂姆·邓肯(Tim Duncan) 9. 杰里·韦斯特(Jerry West) 10. 卡里姆·阿卜杜勒-贾巴尔(Kareem Abdul-Jabbar) 11. 朱利叶斯·欧文(Julius Erving) 12. 伦纳德·弗洛伊德(Lenoard Fournette) 13. 卡尔·马龙(Karl Malone) 14. 莫西·马龙(Moses Malone) 15. 查尔斯·巴克利(Charles Barkley) 16. 艾伦·艾弗森(Allen Iverson) 17. 费城76人乔治·麦肯(George Mikan) 18. 艾尔金·贝勒(Elgin Baylor) 19. 斯蒂夫·纳什(Steve Nash) 20. 詹姆斯·哈登(James Harden) 21. 凯文·加内特(Kevin Garnett) 22. 阿尔吉·贝勒(Archie Bel) 23. 詹姆斯·沃西(James Worthy) 24. 约翰·哈维切克(John Havlicek) 25. 科林·考珀(Kawhi Leonard) 26. 伯纳德·金(Bernard King) 27. 艾迪·琼斯(Eddie Jones) 28. 吉姆·邦德(Jim Boud) 29. 鲍勃·卡尔(Bob Cousy) 30. 波比·琼斯(Bobby Jones) 31. 格兰特·希尔(Grant Hill) 32. 贾马尔·威尔士(Jamaal Wilkes) 33. 瑞克·巴里(Rick Barry) 34. 克莱德·德雷克斯勒(Clyde Drexler) 35. 约翰·斯托克顿(John Stockton) 36. 埃尔文·海耶斯(Elvin Hayes) 37. 格奥尔格·加瓦尼(George Gervin) 38. 丹尼斯·罗德曼(Dennis Rodman) 39. 阿尔·杰弗森(Al Jefferson) 40. 肖恩·肯普(Shawn Kemp) 41. 杰森·基德(Jason Kidd) 42. 克里斯·波什(Chris Bosh) 43. 安东尼奥·麦克迪斯(Antonio McDyess) 44. 贾森·威廉姆斯(Jayson Williams) 45. 恩尼斯特·威廉姆斯(Eniest Wil) 46. 维诺·贾努比利(Manu Ginobili) 47. 格伦·莱斯(Glen Rice) 48. 丹尼尔·吉布森(Daniel Gibson) 49. 布莱恩·斯卡拉布林(Brian Scalabrine) 50. 萨姆·卡塞尔(Sam Cassell)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萨达大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值