【BFS】奇怪的電梯
阿新 • • 發佈:2018-12-09
題目描述 大樓的每一層樓都可以停電梯,而且第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;
}