假期集训课(搜索与图论1)

洛谷P1135奇怪的电梯题解

在这里插入图片描述


#include<iostream>

#include<queue>

using namespace std;

struct node{

         int up,down,step;//向上,向下,步数

         bool visit;//标记是否访问该楼层

}o[210];

int main()

{

         int n,a,b,temp;

         cin >> n>>a>>b;

         for(int i=1;i<=n;i++)

        {

              cin >> temp;//输入楼层上的数字

              o[i].up=i+temp;//向上走到的楼层

              o[i].down=i-temp;//向下走到的楼层

              o[i].step=-1;//每层楼初始的步数

              o[i].visit=false;//每层楼的初始访问状态

        }

    queue<node> q;

    o[a].step=0;

    o[a].visit=true;

    q.push(o[a]);

    while(!q.empty())

    {

           node temp=q.front();

           q.pop();

           int u=temp.up,d=temp.down;

           if(u>=1&&u<=n&&o[u].visit==false)//向上到达的楼层在条件范围并且没访问过将会有以下操作

         {

                 o[u].visit=true;//标记该楼层已访问过了

                 o[u].step=temp.step+1;

                 q.push(o[u]);

         }

        if(d>=1&&d<=n&&o[d].visit==false)//向下到达的楼层在条件范围并且没访问过将会有以下操作

        {

                o[d].visit=true;

                o[d].step=temp.step+1;

                q.push(o[d]);

        }

        if(u==b||d==b)break;//等于想要的目标,打破循环

    }

        cout << o[b].step ;

        return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值