呵呵,有一天我作了一個夢,夢見了一種很奇怪的電梯。大樓的每一層樓均可以停電梯,並且第i層樓(1<=i<=N)上有一個數字Ki(0<=Ki<=N)。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。固然,若是不能知足要求,相應的按鈕就會失靈。例如:3 3 1 2 5表明了Ki(K1=3,K2=3,……),從一樓開始。在一樓,按「上」能夠到4樓,按「下」是不起做用的,由於沒有-2樓。那麼,從A樓到B樓至少要按幾回按鈕呢?ios
輸入文件共有二行,第一行爲三個用空格隔開的正整數,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行爲N個用空格隔開的正整數,表示Ki。spa
輸出格式:輸出文件僅一行,即最少按鍵次數,若沒法到達,則輸出-1。code
LIFT.IN 5 1 5 3 3 1 2 5
LIFT.OUT 3
bfs,裸廣搜blog
///bfs #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; int N,A,B; int a[201],visited[201]; int ans[201]; int flag=0; queue <int> q; void bfs(int ceng); int main() { scanf("%d%d%d",&N,&A,&B); for(int i=1;i<=N;i++){ scanf("%d",&a[i]); } q.push(A); visited[A]=1; ans[A]=0; bfs(1); if(flag==0) printf("-1\n"); return 0; } void bfs(int ceng){ while(!q.empty()){ int t=q.front(); if(t==B){ flag=1; printf("%d\n",ans[B]); break; } int tt; q.pop(); for(int i=0;i<=1;i++){ if(i==0){ tt=t+a[t]; if(!visited[tt]&&tt<=N){ q.push(tt); visited[tt]=1; ans[tt]=ans[t]+1; } } else if(i==1){ tt=t-a[t]; if(!visited[tt]&&tt>=1){ q.push(tt); visited[tt]=1; ans[tt]=ans[t]+1; } } } } }