題目背景:呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第 i 層樓(1<=i<=n)上有乙個數字 ki(0<=ki<=n)。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如:3 3 1 2 5 代表了 ki(k1=3,k2=3...),從一樓開始。在一樓,按「上」可以到 4樓,按「下」是不起作用的,因為沒有-2 樓。那麼,從 a 樓到 b 樓至少要按幾次按鈕呢?
輸入:輸入檔案共有二行,第一行為三個用空格隔開的正整數,表示 n,a,b(1≤n≤200,1≤a,b≤n),第二行為 n 個用空格隔開的正整數,表示 ki。
輸出:輸出檔案僅一行,即最少按鍵次數,若無法到達,則輸出-1。
樣例:
lift.in
5 1 5
3 3 1 2 5
lift.out
3話不多說,直接開講。
題目思路:在一開始的時候,我看到「上」「下」兩種運動方式,我首先想到了二叉樹。接著,我又覺得樹太麻煩了,就建了個圖,然後用dijkstra演算法來求最短路。最終70分 (wrong answer,我也不知道為什麼)。
正解:從a樓開始,進行bfs,用佇列來儲存樓層,每次都彈出隊頭,然後分別向上,向下擴充套件,更新到達該樓層所用的步數,直至隊列為空。(當然,你還可以優化一下,在找到我們需要的目標樓層b後,直接清空佇列,跳出迴圈,節省時間)
但是,你會發現還是超時了,為什麼?
重要的事情說三遍。
所以我們就要用乙個標記陣列來記錄樓層的到達情況,意思就是說,假設我們從1樓擴充套件到了3樓,而三樓並沒有用過,也就是沒有被擴充套件到其他樓層,那麼我們就將它壓入佇列,同時標記一下。這樣就搞定了。
**如下:
#includeusing namespace std;
int c[205];
int n, a, b;
int ans[205];
bool vis[205];
queue q;
void bfs(int root)
q.push(x+c[x]);
}if(x-c[x]>=1&&(!vis[x-c[x]]))
q.push(x-c[x]);}}
if(temp)printf("%d\n", ans[b]);
else printf("-1\n");
/**/
}int main ()
謝謝! 奇怪的電梯(bfs)
思路 這道題的解法很多,深搜廣搜都可以,而我用深搜來解它,首先我們可以將第乙個節點壓入佇列中,然後我們依次搜尋當前樓層可達到的樓層,並且判斷是否越界,如果沒有越界並且該樓層未被訪問過我們就將該節點壓入佇列中,為什麼判斷是否被訪問呢,因為如果當前到達樓層有正確解的話早就找到退出了,再次訪問到它很明顯他...
奇怪的電梯 bfs搜尋
呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第ii層樓 1 le i le n 1 i n 上有乙個數字k i 0 le k i le n ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按...
NOIP模擬 三 T1 太空電梯
border 0 width 330 height 86 src 為了解決日漸增長的人口問題,mstdream 率領乙個小組到達火星開發新的居住地。地球到火星有一架太空電梯,電梯一次最多承載 2 個人,最大載重為 k,小組一共有 n 個人,第 i 個人重量為 vi 人們排成一隊等候上電梯。上電梯的規...