奇怪的電梯(廣度優先搜尋)

2021-07-11 01:57:59 字數 2777 閱讀 8777

description

呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓(1<=i<=n)上有乙個數字ki(0<=ki<=n)。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如:3 3 1 2 5代表了ki(k1=3,k2=3,……),從一樓開始。在一樓,按「上」可以到4樓,按「下」是不起作用的,因為沒有-2樓。那麼,從a樓到b樓至少要按幾次按鈕呢?

input

輸入檔案共有二行,第一行為三個用空格隔開的正整數,表示n,a,b(1≤n≤200, 1≤a,b≤n),第二行為n個用空格隔開的正整數,表示ki。

output

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

sample input

5 1 5

3 3 1 2 5

sample output

3

解題思路:

先讀入資料,用廣搜的思想,尋找從a樓道

b樓的最佳路徑,然後記錄下來,最後輸出的時候遞迴回去就行了。

程式:
const
maxn=1000;

var
father,state,a,f:array[1..maxn] of longint;
n,a1,b,ans:longint;

procedure init;
var

i:longint;

begin

readln(n,a1,b);

for i:=1 to n do

read(a[i]);

f[a1]:=1;

ans:=0;

end;

function check(x:longint):boolean;
begin

if (x>0) and (x<=n) and (f[x]=0) then exit(true);

check:=false;

end;

procedure dg(x:longint);
begin

if x=0 then exit;

dg(father[x]);

inc(ans);

end;

procedure bfs;
var

h,t:longint;

begin

h:=0;

t:=1;

state[1]:=a1;

father[1]:=0;

repeat

inc(h);

if check(state[h]+a[state[h]]) then

begin

inc(t);

state[t]:=state[h]+a[state[h]];

father[t]:=h;

f[state[t]]:=1;

if state[t]=b then

begin

dg(t);

break;

end;

end;

if check(state[h]-a[state[h]]) then

begin

inc(t);

state[t]:=state[h]-a[state[h]];

father[t]:=h;

f[state[t]]:=1;

if state[t]=b then

begin

dg(t);

break;

end;

end;

until h>=t;

if h>=t then writeln(-1)

else writeln(ans-1);

end;

begin
init;
if a1=b then writeln(0)
else bfs;
end.

P1135 奇怪的電梯 廣度搜尋bfs

注 參考過網上 理解後寫的,看的這位寫的很清楚,表示感謝。參考鏈結傳送門 呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓 1 i n 上有乙個數字ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要...

廣度優先搜尋練習之神奇的電梯

廣度優先搜尋練習之神奇的電梯 time limit 1000ms memory limit 65536k 題目描述 有一座已知層數為n的高樓,這座高樓的特殊之處在於只能靠電梯去上下樓,所以要去到某一層要非常耽誤時間,然而更悲哀的是,這座高樓的電梯是限號的,小鑫最開始的時候在1層,他想去第x層,問題是...

廣度優先搜尋練習之神奇的電梯

廣度優先搜尋練習之神奇的電梯 time limit 1000ms memory limit 65536kb submit statistic problem description 有一座已知層數為n的高樓,這座高樓的特殊之處在於只能靠電梯去上下樓,所以要去到某一層要非常耽誤時間,然而更悲哀的是,這...