一天一道演算法題 奇怪的電梯(BFS)

2022-05-06 17:33:38 字數 1080 閱讀 2390

題目描述

呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓(1≤i≤n)上有乙個數字k_i(0≤ki​≤n)。

電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。

例如:3, 3 ,1 ,2 ,5代表了k_i(k_1=3,k_2=3,…),從1樓開始。在1樓,按「上」可以到4樓,按「下」是不起作用的,因為沒有−2樓。

那麼,從a樓到b樓至少要按幾次按鈕呢?

共二行。

第一行為3個用空格隔開的正整數,表示n,a,b(1≤n≤200, 1≤a,b≤n)

第二行為n個用空格隔開的非負整數,表示k_i。

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

輸入5 1 5

3 3 1 2 5

輸出 3

我的解法

1 #include2

using

namespace

std;34

int n, a, b,k[210];5

bool f[210] = ;67

void

bfs()

21if (p.first - k[p.first] > 0

) 26

if (p.first + k[p.first] <=n) 31}

32 cout << -1;33

}3435int

main()

用時32ms

廣度優先搜尋演算法的思路:

1、對於初始狀態入隊,設定初始狀態為已訪問

2、如果佇列不為空時,出隊隊頭元素,否則跳到第5步

3、檢查出隊的元素是否為最終解,如果是則跳到第5步。

4、對於出隊的元素,檢查所有相鄰狀態,如果有效並且未訪問,則將 所有有效的相鄰狀態進行入隊,並且設定這些狀態為已訪問,然後 跳到第2步重複執行

5、檢查最後出隊的元素是否為最終解,如果是輸出結果,否則說明無解

廣度優先搜尋演算法的關鍵是要搞清楚求解過程中每一步的相鄰狀態有哪些, 每個狀態需要記錄什麼資訊,在搜尋過程中如何標記這些狀態為已訪問。

一天一道演算法題 樹狀陣列

題目 模板 樹狀陣列1 樹狀陣列和線段樹差不多,可以處理區間操作,但是處理不了太複雜的區間問題。不過 比線段樹簡潔很多很多!時間複雜度都為o logn 例如,區間 1,8 儲存方式如下 1 tree 1 num 1 001 001 2 tree 2 num 2 num 1 010 010 001 3...

一天一道演算法題 線段樹

題目 模板 線段樹1 rmq問題 range minimum maximum query 和求區間和的問題可以用暴力法做,時間複雜度為o n 2 用在本題會超時,所以我們選擇線段樹做。線段樹是一種用於區間操作的資料結構,用二叉樹構造。如圖。線段樹的每個節點代表了乙個區間。防止超時,用了lazy標記。...

一天一道演算法題 5 24 遞迴

我們每一天都應該比昨天更強一點 觀察下列式子 12 12 1 12 6 2 12 4 3 12 3 4 12 3 2 2 12 2 6 12 2 3 2 12 2 2 3 對於給定的n 計算n公有多少種不同的分解式?1 include 2 using namespace std 34 int cnt...