1. 程式人生 > 其它 >C++-電梯 解題思路

C++-電梯 解題思路

【Horn Studio】程式設計專欄: 電梯  解題思路

題目

題目描述

小明所住的居民樓的電梯非常獨特,樓房的每一層都可以停電梯,並且第i(1iN)i(1≤i≤N)層的電梯上有一個數字Ki(0KiN)Ki(0≤Ki≤N)。電梯上只有兩個按鈕:上、下。如果在第ii層按上,那麼電梯會去到i+Kii+Ki樓(當然i+Kii+Ki必須要小於等於NN,否則電梯不會動);如果在ii層按下,那麼電梯會去到iKii−Ki樓(當然iKii−Ki必須要大於等於11,否則電梯不會動);當然你也可以選擇不按按鈕。那麼從AA層到BB層最少要按幾次按鈕呢?

輸入

第一行三個數字表示N,A,BN,A,B。

第二行
NN個數字,第ii個數字表示KiKi。

輸出

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

樣例輸入 複製

5 1 5
3 3 1 2 5

樣例輸出 複製

3

提示

所有資料滿足:1N200,1A,BN1≤N≤200,1≤A,B≤N。

思路

一道比較好的搜尋題,dfs的話要略微剪枝,bfs應該就不用擔心了

(我才不會告訴你bfs寫不出來呢)

然而題目還是比較簡單

可是我感覺自己的智商餘額已經為0了

 

 

因此,我們就使用dfs來解答,雖然同為暴力演算法,但又有那麼一點不同……

很容易發現實際上就是找最短路,#對於邊權(即路徑長度)的值可以抽象為每次增加的運算元,即均為1,好主意!

我們使用爆搜+最短路徑,程式碼量又少又好理解。

程式碼

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int n,a,b,ans=0x7ffffff;
 5 int to[205];
 6 bool vis[205];
 7 void dfs(int now,int sum)
 8 {
 9     if(now==b) ans=min(ans,sum);
10     if(sum>ans) return;
11     vis[now]=1;
12     if(now+to[now]<=n&&!vis[now+to[now]]) dfs(now+to[now],sum+1
); 13 if(now-to[now]>=1&&!vis[now-to[now]]) dfs(now-to[now],sum+1); 14 vis[now]=0; 15 } 16 int main() 17 { 18 scanf("%d%d%d",&n,&a,&b); 19 for(int i=1;i<=n;i++) scanf("%d",&to[i]); 20 vis[a]=1; 21 dfs(a,0); 22 if(ans!=0x7ffffff) printf("%d",ans); 23 else printf("-1"); 24 return 0; 25 }

彩蛋

洛谷老黃曆逼得我關了電腦……額……我用手機寫部落格!