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 }

彩蛋

:很簡單的~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM