奇怪的電梯(DP動態規劃和BFS)

2021-08-25 22:26:01 字數 1638 閱讀 8562

奇怪的電梯

題意:大樓的每一層樓都可以停電梯,每層樓均有乙個數字,電梯只有兩個按鈕,相應的按鈕:上和 下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕會失靈。例如,一樓的數字為3,則按「上」可以到4樓,按「下」是不起作用的,因為沒有-2樓。

輸入

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

輸出

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

樣例輸入

5 1 5

3 3 1 2 5

樣例輸出

3**分析與講解都在注釋裡,採用dp(動態規劃來解答)

為了動態分配記憶體,採用stl的vector容器來解答,也可以簡單的用陣列來實現

#include 

#include

#include

using

namespace

std;

inline

long

long min(long

long a, long

long b)

int main()

dp.push_back(v);

}k.push_back(0);//為了方便理解,先push乙個0,使得下標從1開始

for (int i = 1; i <= n; i++)

//首先初始化電梯按下1次即可到達的層數

for (int i = 1; i <= n; i++)

if (i - k[i] >= 1)

}for (int i = 1; i <= n; i++)}}

/* //輸出最終陣列答案,

for (int i = 1; i <= n; i++)

else

}cout << endl;}*/

if (dp[start][end] == int_max) //為了方便觀察,將不能到達的值輸出為-1

else

return

0;}

**分析與講解都在注釋裡,採用bfs解答

為了動態分配記憶體,採用stl的vector容器和queue佇列容器來解答,也可以簡單的用陣列來實現

#include 

#include

#include

using

namespace

std;

int main()

q.push(start);

while (!q.empty()&& !flag.at(q.front()))//佇列不為空,切第q.front()層沒有被訪問過

}next = q.front() - v.at(q.front());

if (next >= 1)//下樓

}q.pop();

}cout

<< f.at(end) << endl;

return

0;}

奇怪的電梯(bfs)

思路 這道題的解法很多,深搜廣搜都可以,而我用深搜來解它,首先我們可以將第乙個節點壓入佇列中,然後我們依次搜尋當前樓層可達到的樓層,並且判斷是否越界,如果沒有越界並且該樓層未被訪問過我們就將該節點壓入佇列中,為什麼判斷是否被訪問呢,因為如果當前到達樓層有正確解的話早就找到退出了,再次訪問到它很明顯他...

奇怪的電梯 bfs搜尋

呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第ii層樓 1 le i le n 1 i n 上有乙個數字k i 0 le k i le n ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按...

T1 奇怪的電梯(BFS)

題目背景 呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第 i 層樓 1 i n 上有乙個數字 ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如 3 3 1 2 5 代表了 ...