练习赛12.2.奇怪电梯

奇怪的电梯

Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 10 Accepted Submission(s) : 5
Font: Times New Roman | Verdana | Georgia
Font Size: ← →

Problem Description

大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。电梯只有四个按钮:开、关、上、下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,...),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?

Input

输入第一行为T,表示数据组数,对于每组数据的共二行,第1行为三个用空格隔开的正整数,表示N,A,B(1<=N<=200,1<=A,B<=N),第2行为N个用空格隔开的正整数,表示Ki。

Output

对于每组数据输出最少按键次数,若无法到达,输出-1。

Sample Input

1
5 1 5
3 3 1 2 5

Sample Output

3
思路分析:这是广搜的题目,主要在于它只有两个方向的搜索要用到结构体。
代码:#include<iostream>
#include<string.h>
#include<queue>
#include<stdio.h>
using namespace std;
int t,n,a,b,flag;
int move[300],visit[430];
struct tmp
{
    int f;//为当前楼数
    int step;//为步数
};
void bfs(tmp s)
{
    int i;
    queue<tmp>q;
    //q.push(s);
    tmp s1,pp;
    for(q.push(s);!q.empty();q.pop())
    {
       s1=q.front();
        //s1.step=0;
        //s1.=s1.f+move[s1.f];//即楼数为当前楼数加上当前的要上的楼数。
        if(s1.f==b) {printf("%d\n",s1.step); flag=1;}
        else
        {
            pp.f=s1.f-move[s1.f];//从当前相下运动
            if(pp.f>=1&&pp.f<=n&&!visit[pp.f])
            {
                visit[pp.f]=1;
                pp.step=s1.step+1;
                q.push(pp);
            }
            pp.f=s1.f+move[s1.f];//从当前向上运动。
            if(pp.f>=1&&pp.f<=n&&!visit[pp.f])
            {
                visit[pp.f]=1;
                pp.step=s1.step+1;
                q.push(pp);
            }
        }


    }
}
int main()
{
    int i;
    scanf("%d",&t);
    while(t--)
    {
flag=0;
        memset(visit,0,sizeof(visit));
        scanf("%d%d%d",&n,&a,&b);
        for(i=1;i<=n;i++)
            scanf("%d",&move[i]);
            tmp pp;
            pp.step=0;
            pp.f=a;
            visit[a]=1;
            bfs(pp);
            if(!flag)
                printf("-1\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值