C++-電梯 解題思路
阿新 • • 發佈:2022-04-09
【Horn Studio】程式設計專欄: 電梯 解題思路
題目
題目描述
小明所住的居民樓的電梯非常獨特,樓房的每一層都可以停電梯,並且第i(1≤i≤N)i(1≤i≤N)層的電梯上有一個數字Ki(0≤Ki≤N)Ki(0≤Ki≤N)。電梯上只有兩個按鈕:上、下。如果在第ii層按上,那麼電梯會去到i+Kii+Ki樓(當然i+Kii+Ki必須要小於等於NN,否則電梯不會動);如果在ii層按下,那麼電梯會去到i−Kii−Ki樓(當然i−Kii−Ki必須要大於等於11,否則電梯不會動);當然你也可以選擇不按按鈕。那麼從AA層到BB層最少要按幾次按鈕呢?輸入
第一行三個數字表示N,A,BN,A,B。第二行
輸出
一行,即最少按鍵次數,若無法到達,則輸出−1−1。樣例輸入 複製
5 1 5
3 3 1 2 5
樣例輸出 複製
3
提示
所有資料滿足:1≤N≤200,1≤A,B≤N1≤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 }
彩蛋
洛谷老黃曆逼得我關了電腦……額……我用手機寫部落格!