1. 程式人生 > 實用技巧 >P1135 奇怪的電梯(洛谷)

P1135 奇怪的電梯(洛谷)

題解題目描述

呵呵,有一天我做了一個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第iii層樓(1≤i≤N)(1 \le i \le N)(1iN)上有一個數字Ki(0≤Ki≤N)K_i(0 \le K_i \le N)Ki(0KiN)。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如:3,3,1,2,53, 3 ,1 ,2 ,53,3,1,2,5代表了Ki(K1=3,K2=3,…)K_i(K_1=3,K_2=3,…)Ki(K1=3,K2=3,),從111樓開始。在111樓,按“上”可以到444樓,按“下”是不起作用的,因為沒有−2-22樓。那麼,從AAA樓到BBB樓至少要按幾次按鈕呢?

輸入格式

共二行。

第一行為333個用空格隔開的正整數,表示N,A,B(1≤N≤200,1≤A,B≤N)N,A,B(1≤N≤200, 1≤A,B≤N)N,A,B(1N200,1A,BN)。

第二行為NNN個用空格隔開的非負整數,表示KiK_iKi

輸出格式

一行,即最少按鍵次數,若無法到達,則輸出−1-11。

輸入輸出樣例

輸入 #1
5 1 5
3 3 1 2 5
輸出 #1
3
題解: 一道bfs水題 題解程式碼:
#include<iostream>
#include<queue>
#include<algorithm>
#include
<string.h> using namespace std; const int maxn=200+5; int n,a,b; int color[maxn]={0}; //用做標記 int k[maxn]; // int sum=0; //記錄按鍵數 int flag=0; //記錄是否到達B層 int d[maxn]={0}; //用於存放到達各層的按鍵數(第一次存的即是最小按鍵數) //由於此處求最小的按鍵數,因此使用bfs更方便一些 void bfs(int s){ queue<int> que; que.push(s); color[s]
=1; //代表訪問過 之後訪問時就不再入隊 d[s]=0; //起始層不需要按 while(!que.empty()){ int temp; temp = que.front(); que.pop(); // cout<<"temp:"<<temp<<" d:"<<d[temp]<<endl; if(temp==b){ //代表到達了B層 flag=1; return; } int t1=temp+k[temp]; int t2=temp-k[temp]; if(t1<=n&&t1>=1&&color[t1]==0){ que.push(t1); color[t1]=1; d[t1]=d[temp]+1; //按鍵數+1 } if(t2>=1&&t2<=n&&color[t2]==0){ que.push(t2); color[t2]=1; d[t2]=d[temp]+1; } } } int main(){ cin>>n>>a>>b; for(int i=1;i<=n;i++){ cin>>k[i]; } bfs(a); if(flag){ cout<<d[b]; }else cout<<"-1"; return 0; }