Catch That
Cow
Description
Farmer John has been informed of the location of a fugitive
cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000)
on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same
number line. Farmer John has two modes of transportation: walking and
teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X
+ 1 in a single minute
* Teleporting: FJ can move from any point X to the
point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not
move at all, how long does it take for Farmer John to retrieve
it?
Input
Line 1: Two space-separated integers: N and K
Output
Line
1: The least amount of time, in minutes, it takes for Farmer John to catch the
fugitive cow.
Sample Input
5 17
Sample Output
4
Hint
The
fastest way for Farmer John to reach the fugitive cow is to move along the
following path: 5-10-9-18-17, which takes 4 minutes.
题目大意:
有个农夫在N点,有个牛在K点。农夫有三种移动方式:1)向前一步 2)向后一步 3)从当所在位置X瞬间移动到2*X点
输出最少进行多少步,农夫能找到牛。(大坑是农夫和牛的活动范围在[0,100000])
结题思路:
bfs即可。注意农夫的可活动范围
Code:
1 #include<string>
2 #include<cstring>
3 #include<cstdio>
4 #include<queue>
5 #include<iostream>
6 using namespace std;
7 int dis[100005],vis[100005],N,K;
8 queue<int> q;
9 int bfs(int N,int K)
10 {
11 q.push(N);
12 dis[N]=0,vis[N]=1;
13 while (!q.empty())
14 {
15 int x[5],i;
16 int front=q.front();
17 q.pop();
18 x[1]=front-1,x[2]=front+1,x[3]=front*2;
19 for (i=1; i<=3; i++)
20 {
21 if (x[i]>=0&&x[i]<=100000&&!vis[x[i]])
22 {
23 q.push(x[i]),vis[x[i]]=1,dis[x[i]]=dis[front]+1;
24 if (x[i]==K) return dis[x[i]];
25 }
26 }
27 }
28 }
29 int main()
30 {
31 cin>>N>>K;
32 if (N==K) cout<<0;
33 else
34 cout<<bfs(N,K);
35 return 0;
36 }