1. 程式人生 > 其它 >C++-抓住那頭牛 解題思路

C++-抓住那頭牛 解題思路

題目

【Horn Studio】程式設計專欄: 求細胞數量 解題思路

題目描述

農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農夫起始位於點N(0<=N<=100000),牛位於點K(0<=K<=100000)。農夫有兩種移動方式:
1、從X移動到X-1或X+1,每次移動花費一分鐘 2、從X移動到2*X,每次移動花費一分鐘   假設牛沒有意識到農夫的行動,站在原地不動。農夫最少要花多少時間才能抓住牛?

輸入

兩個整數,N和K

輸出

一個整數,農夫抓到牛所要花費的最小分鐘數

樣例輸入 複製

5 17

樣例輸出 複製

4

提示

 

來源

思路

這道題是一道純度極高又經典的BFS,

看到這還不知道什麼是bfs?

C++-BFS 廣搜的含義 - 馮子坤 - 部落格園 (cnblogs.com)

農夫在每個點都有三條路可以選擇,即類似於:在每一個結點都有三個相鄰的結點。現在需要最短時間找到牛,所以用廣搜是比較容易解決的。關鍵是要理清楚資料結構的問題。

因此,我們需要……無中生有暗度陳倉……生成一個數組,濱並將第一個設定為1(及走過的)

總之下來,這道題有點類似短路問題,確實BFS之中的精髓。

BFS版本程式碼

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int vis[5000000];
 4 int b[4];
5 int n,k; 6 queue <int> q; 7 void bfs(int n){ 8 q.push(n); 9 while(!q.empty()){ 10 int tmp=q.front(); 11 if(tmp==k){ 12 cout<<vis[tmp]-1; 13 return; 14 }b[1]=tmp-1; 15 b[2]=tmp+1; 16 b[3]=2*tmp; 17 for(int
i=1;i<4;i++){ 18 if(vis[b[i]]==0&&b[i]>=0&&b[i]<4*k){ 19 q.push(b[i]); 20 vis[b[i]]=vis[tmp]+1; 21 } 22 }q.pop(); 23 } 24 } 25 int main(){ 26 cin>>n>>k; 27 vis[n]=1; 28 bfs(n); 29 return 0; 30 31 }

彩蛋

:很簡單的~