1. 程式人生 > >【Luogu P1135】 奇怪的電梯

【Luogu P1135】 奇怪的電梯

sam pop 個數 電梯 http ipo zhang pan .cn

題目描述

呵呵,有一天我做了一個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第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:
5 1 5
3 3 1 2 5
輸出樣例#1:
3



===============================================================================================================================================
這道題是在學校的acm賽制的月考上做的,然後因為我(du)是(cai)隊(zhuan)長(zhen),所以我們隊就叫Poppin‘Party。(popipa pipopa popipapapipopa!)
然後因為我小(tai)小(guo)失(zhi)誤(zhang),所以把vis和map定義為局部變量還沒有memset,這道送分題上罰了不少時,沒能成功rk1。QAQ
技術分享圖片



話不多說上代碼(看了別人stl的覺得還是模擬好寫w
#include <iostream>
#include <cstdio>
using namespace std;
int n,a,b,k,head,tail,q[210],ste[210];
bool vis[210],map[210][210];
int main(){
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++){
        cin>>k;
        if(i+k<=n)    map[i][i+k]=1
; if(i-k>0) map[i][i-k]=1; } if(a==b) {cout<<0<<endl;return 0;} head=0,tail=1; vis[a]=1; q[1]=a; ste[1]=0; while(head<=tail){ head++; for(int i=1;i<=n;i++){ if(vis[i]) continue; if(map[q[head]][i]==0) continue; tail++; vis[i]=1; q[tail]=i; ste[tail]=ste[head]+1; if(q[tail]==b) {cout<<ste[tail]<<endl; return 0;} } }cout<<-1<<endl; }

【Luogu P1135】 奇怪的電梯