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

【BFS】奇怪的電梯

題目描述 大樓的每一層樓都可以停電梯,而且第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。

樣例輸入 5 1 5 3 3 1 2 5

樣例輸出 3

思路: 廣搜思路,一層一層的搜。

#include<iostream>
#include<cstdio>
using namespace std;
int head,tail,k,n,m,a[500],d[500][3];
bool f[500]={0};
int main()
{
    scanf("%d%d%d",&k,&n,&m);
    if (n==m)//判斷是否在目標層
    {
        printf("0");
        return 0;
    }
    for
(int i=1;i<=k;i++) scanf("%d",&a[i]); d[1][1]=n; d[1][2]=a[n]; d[1][3]=0; head=tail=1;//定義初始值 while(head<=tail) { if (d[head][1]+d[head][2]<=k)//判斷是否出界 { tail++; d[tail][1]=d[head][1]+d[head][2]; d[tail][2]=a[d[tail][1
]]; d[tail][3]=d[head][3]+1;//此路徑加一 if (f[d[tail][1]])tail--;//判斷是否走過 else f[d[tail][1]]=1; if (d[tail][1]==m)//判斷是否到達目標層 { printf("%d",d[tail][3]); return 0; }; }; if (d[head][1]-d[head][2]>0)//判斷是否出界 { tail++; d[tail][1]=d[head][1]-d[head][2]; d[tail][2]=a[d[tail][1]]; d[tail][3]=d[head][3]+1;//此路徑加一 if (f[d[tail][1]])tail--;//判斷是否走過 else f[d[tail][1]]=1; if (d[tail][1]==m)//判斷是否到達目標層 { printf("%d",d[tail][3]); return 0; }; }; head++; } printf("-1\n");//如果沒有結果就輸出-1 return 0; }