題目
【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 }
彩蛋
:很簡單的~