1. 程式人生 > 其它 >抓住那頭牛

抓住那頭牛

題目

題目描述

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

輸入

兩個整數,N和K

輸出

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

樣例輸入

5 17

樣例輸出

4

思路

這道題是一道BFS,

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

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

總之下來,這道題有點類似短路問題,確實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 }