首页 > 代码库 > P1135 奇怪的电梯

P1135 奇怪的电梯

 

P1135 奇怪的电梯

题目描述

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

输入输出格式

输入格式:

 

输入文件共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。

 

输出格式:

 

输出文件仅一行,即最少按键次数,若无法到达,则输出-1。

 

输入输出样例

输入样例#1:
LIFT.IN5 1 53 3 1 2 5
输出样例#1:
LIFT.OUT3

题解:

很简单,看代码。

前言:

高手在民间。

民间版的比官方版的跑的快多了。

AC代码1(bfs)--民间版:

#include<cstdio>using namespace std;#define N 210#define QLEN 205int n,S,T,d[N];bool vis[N];struct node{    int p,step;}que[N];void bfs(){    int h=0,t=1;    que[1].p=S;    que[1].step=0;    if(que[t].p==T){        printf("%d\n",que[t].step);        return ;    }    while(h!=t){        if(++h>QLEN) h=1;        node up=que[h];        int px=up.p+d[up.p];        if(!vis[px]&&px<=n){            vis[px]=1;            if(++t>QLEN) t=1;            que[t].p=px;            que[t].step=que[h].step+1;            if(que[t].p==T){                printf("%d\n",que[t].step);                return ;            }        }        int po=up.p-d[up.p];        if(!vis[po]&&po>=1){            vis[po]=1;            if(++t>QLEN) t=1;            que[t].p=po;            que[t].step=que[h].step+1;            if(que[t].p==T){                printf("%d\n",que[t].step);                return ;            }        }    }    puts("-1");}int main(){    scanf("%d%d%d",&n,&S,&T);    for(int i=1;i<=n;i++) scanf("%d",&d[i]);    bfs();    return 0;}

 

AC代码2(递推)--官方版

#include<cstdio>#include<cstring>#include<iostream>using namespace std;#define N 210#define QLEN 205int n,S,T,g[N][N];int main(){    memset(g,127/3,sizeof g);    scanf("%d%d%d",&n,&S,&T);    if(S==T){puts("0");return 0;}    for(int i=1;i<=n;i++) g[i][i]=1;    for(int i=1,x;i<=n;i++){        scanf("%d",&x);        if(i-x>=1) g[i][i-x]=1;        if(i+x<=n) g[i][i+x]=1;    }    for(int k=1;k<=n;k++){        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                g[i][j]=min(g[i][j],g[i][k]+g[k][j]);            }        }    }    printf("%d\n",g[S][T]!=g[0][0]?g[S][T]:-1);    return 0;}

 

P1135 奇怪的电梯