奇怪的電梯 bfs搜尋

2021-09-10 19:04:57 字數 1258 閱讀 7690

呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第ii層樓(1 \le i \le n)(1≤i≤n)上有乙個數字k_i(0 \le k_i \le n)ki​(0≤ki​≤n)。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如:3, 3 ,1 ,2 ,5代表了k_i(k_1=3,k_2=3,…),從1樓開始。在1樓,按「上」可以到4樓,按「下」是不起作用的,因為沒有−2樓。那麼,從aa樓到bb樓至少要按幾次按鈕呢?

輸入格式:

共二行。

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

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

輸出格式:

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

輸入樣例#1:複製

5 1 5

3 3 1 2 5

輸出樣例#1:複製

3
這裡用bfs實現

#include#includeusing namespace std;

int n, a, b;

int arr[202];//每層樓的編號

int res[202];//標記是否走過

typedef struct floorn;

queueq;

int main()

floorn q1, q2;

q1.floor = a;

q1.pushnum = 0;

q.push(q1);

res[a] = 1;

while (!q.empty())

i = q2.floor - arr[q2.floor];

if (i >= 1 && res[i] == 0)//如果電梯向下坐不出邊界

}if (q2.floor == b)

cout << q2.pushnum << endl;

else

cout << -1 << endl;

system("pause");

return 0;

}

這裡標記是否走過是因為這個題目雖然沒有像迷宮題明顯提出不能重複走,但是這裡的電梯只有相同的上下兩種方向,所以如果重複的話一定是步數會增多而且沒有必要

奇怪的電梯(bfs)

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

P1135 奇怪的電梯 廣度搜尋bfs

注 參考過網上 理解後寫的,看的這位寫的很清楚,表示感謝。參考鏈結傳送門 呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓 1 i n 上有乙個數字ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要...

T1 奇怪的電梯(BFS)

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