原題位址戳這裡
呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓(1 ≤ i ≤ n)上有乙個數字k_i(0 ≤ k_i ≤ n) 。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如:3, 3 ,1 ,2 ,5代表k_i(k_1=3,k_2=3,…),從1樓開始。在1樓,按「上」可以到4樓,按「下」是不起作用的,因為沒有-2樓。那麼,從a樓到b樓至少要按幾次按鈕呢?
輸入格式
共二行。
第一行為33個用空格隔開的正整數,表示n,a,b(1≤n≤200,1≤a,b≤n)。
第二行為n個用空格隔開的非負整數,表示k_i 。
輸出格式
一行,即最少按鍵次數,若無法到達,則輸出−1。
輸入輸出樣例
輸入 #1
5 1 5
3 3 1 2 5
輸出 #1
3這一題其實是可以用bfs(廣度優先搜尋)來做的,而且也比較簡單。
先解釋一下樣例:
最後輸出的就是3,是不是很簡單:p
大概的**就是說先定義乙個陣列,全部賦值成2147483647,這個陣列用來存最少步數,然後把起始樓層設為0(本來就在這個樓層了還走個啥嘞),然後就是標準的bfs了,先貼一下bfs**:
void
bfs()if
(a1-num[a1]
<=n&&result[a1-num[a1]
]== inf)
s.pop();
//彈出隊頭
}}
不判斷會死迴圈,比如說乙個樣例:
5 1 5不加inf就會一直死迴圈,因為一開始在一樓,跑到4樓,因為向下跑不犯規,所以就又回到了1樓,之後,嘿嘿。。。3 3 1 3 5
#include
using
namespace std;
const
int inf =
2147483647
;int n,a,b;
int num[
205]
;int result[
205]
;void
bfs()if
(a1-num[a1]
<=n&&result[a1-num[a1]
]== inf)
s.pop();
}}intmain()
//賦初值
cin>>n>>a>>b;
for(
int i =
1;i<=n;i++
) result[a]=0
;bfs()
;if(result[b]
== inf)
else
}
洛谷p1135 奇怪的電梯
題目描述 呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓 1 i n 上有乙個數字ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如 3 3 1 2 5代表了ki k1...
洛谷P1135 奇怪的電梯
呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第iii層樓 1 i n 上有乙個數字ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如 3,3,1,2,5代表了ki k1 3,...
洛谷 奇怪的電梯(P1135)
奇怪的電梯 問題分析 根據問題描述,所處在的樓層,上或下的層數由給定數值確定。但是超出範圍則不予響應。舉個例子,如下表所示。樓層號123 456指定數值33 1251 觀察例子發現,每一層到達的樓層是確定的,如果將樓層模擬成頂點,相互間存在到達關係的表示有通路,因此可以將上述問題求解過程,轉變為求頂...