POJ3278——Catch That Cow(BFS)

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即可。注意农夫的可活动范围

ps:HUD 2717与这个题一样,但是是多组输入输出,请注意!

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 }

 

posted @ 2014-06-04 17:09  Enumz  阅读(212)  评论(0编辑  收藏  举报