描述
農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農夫起始位於點N(0<=N<=100000),牛位於點K(0<=K<=100000)。農夫有兩種移動方式:
1、從X移動到X-1或X+1,每次移動花費一分鐘
2、從X移動到2*X,每次移動花費一分鐘
假設牛沒有意識到農夫的行動,站在原地不動。農夫最少要花多少時間才能抓住牛?
輸入
兩個整數,N和K
輸出
一個整數,農夫抓到牛所要花費的最小分鐘數
樣例輸入
5 17
樣例輸出
4
思路
雖然是給的數軸上的點,但不能再數軸上隨便移動,只能通過特定的路徑進行移動。因此,可以將數軸和路徑看做圖,問題就變成了圖上最短路徑問題。由於圖上所有邊都是等長的,可以直接進行廣度搜索。如果進行深度搜索的話,容易搜偏導致比較費時。
#include <stdio.h>
#include <queue>
#define M 100005
using namespace std;
struct Node{
int level;
int f;
Node(){
level=0;
f=0;
}
};
Node node[100005];
int N,K;
int main()
{
scanf("%d%d",&N,&K);
//N=5,K=17;
queue<int> q;
q.push(N);
int next = N;
node[N].f=1;
while(!q.empty()){
next = q.front();
q.pop();
if(next == K){
printf("%d",node[K].level);
break;
}
if(next+1<M && node[next+1].f==0){
q.push(next+1);
node[next+1].level=node[next].level+1;
node[next+1].f=1;
}
if(next-1>=0 &&node[next-1].f==0){
q.push(next-1);
node[next-1].level=node[next].level+1;
node[next-1].f=1;
}
if(next*2<M && node[next*2].f==0){
q.push(next*2);
node[next*2].level=node[next].level+1;
node[next*2].f=1;
}
}
return 0;
}