首页 > 其他 > 详细

P1135 奇怪的电梯

时间:2020-05-15 13:21:03      阅读:70      评论:0      收藏:0      [点我收藏+]

首先看题:

技术分享图片

 

 

 其实就是求A楼到B楼至少要按几次按钮。

这个题就是普通的搜索,具体请看代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long n,a,b,bj=1;//n,a,b具体看题目,bj表示是否能到达B楼 
long long k[101000],book[101000];//k数组为每层楼的数,book数组用来标记是否访问过 
struct Node{
    int cs;//层数 
    int ans;//答案 
}q[101000];//数组模拟队列 
void bfs(){
    int head=0,tail=1,dq;//头,尾,dq表示当前楼层 
    q[1].cs=a;//当前层数 
    q[1].ans=1;//当前的答案 
    book[a]=1;//标记 
    while(head<tail){
        head++;//头++,相当于入栈 
        dq=q[head].cs+k[q[head].cs];//如果上楼,计算当前的层数 
        if(dq>=1&&dq<=n&&book[dq]==0){//判断是否越界,是否访问过 
            tail++;//尾++,出栈 
            q[tail].ans=q[head].ans+1;//更新答案 
            q[tail].cs=dq;//更新当前层数 
            book[q[tail].cs]=1;//标记为访问过 
        }
        if(dq==b){//如果到B楼了 
            bj=2;//标记为可以到达 
            printf("%lld\n",q[head].ans);//输出答案 
            return;//退出 
        }
        dq=q[head].cs-k[q[head].cs];//如果下楼,计算当前的层数
        if(dq>=1&&dq<=n&&book[dq]==0){//判断是否越界,是否访问过
            tail++;//尾++,出栈
            q[tail].ans=q[head].ans+1;//更新答案
            q[tail].cs=dq;//更新当前层数
            book[q[tail].cs]=1;//标记为访问过
        }
        if(dq==b){//如果到B楼了
            bj=2;//标记为可以到达
            printf("%lld\n",q[head].ans);//输出答案 
            return;//退出
        }
    }
}
int main(){
    scanf("%lld%lld%lld",&n,&a,&b);//输入 
    for(int i=1;i<=n;i++){
        scanf("%lld",&k[i]);//输入 
    }
    if(a==b){//特判A楼是否和B楼在同一层 
        printf("0\n");
        return 0; 
    }
    bfs();//搜索 
    if(bj==1){//如果不能到达B楼 
        printf("-1\n");
    }
    return 0;
}

 

P1135 奇怪的电梯

原文:https://www.cnblogs.com/shanxx/p/12894012.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!