奇怪的電梯
題意:大樓的每一層樓都可以停電梯,每層樓均有乙個數字,電梯只有兩個按鈕,相應的按鈕:上和 下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕會失靈。例如,一樓的數字為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 代表了 ...