【Luogu P1135】 奇怪的電梯
阿新 • • 發佈:2017-11-28
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】 奇怪的電梯