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 53 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的高樓,這座高樓的特殊之處在於只能靠電梯去上下樓,所以要去到某一層要非常耽誤時間,然而更悲哀的是,這...