POJ 3278(bfs)

Catch That Cow
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 31637   Accepted: 9740

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.
 1 //注意下标不可变为-1,两个数组均要开到20w,为此吃了好几个re 
 2 //大致题意:n可以执行加一减一乘二,求至少几步到k 
 3 #include <iostream>
 4 #include <queue>
 5 #include <cstring>
 6 #include <cstdlib>
 7 using namespace std;
 8 const int N = 100000;
 9 int a[200005];
10 queue <int > q;
11 int vis[N*2+5];
12 void bfs(int n,int k)
13 {
14     vis[n] = true;
15     q.push(n);
16     while(!q.empty())
17     {
18         int head = q.front();
19         q.pop();
20         if(head==k)
21         {
22             return ;
23         }
24         else
25         {//原来没加大于0的条件,结果re 
26             if(!vis[head-1]&&head<=N&&head>=1)//禁止下标变为-1 
27             {
28                 vis[head-1] = true;
29                 a[head-1]+=a[head]+1;
30                 q.push(head-1);
31             }
32             if(!vis[head+1]&&head<N&&head>=0)
33             {
34                 vis[head+1] = true;
35                 a[head+1]+=a[head]+1;
36                 q.push(head+1);
37             }
38             if(!vis[head*2]&&head<=50000&&head>=0)
39             {
40                 vis[head*2] = true;
41                 a[head*2]+=a[head]+1;
42                 q.push(head*2);
43             }
44         }
45     }
46 }   
47 int main()
48 {
49     int n,k;
50     cin>>n>>k;
51     memset(vis,false,sizeof(vis));
52     memset(a,0,sizeof(a));
53     while(!q.empty())
54         q.pop();
55     bfs(n,k);
56     if(n>=k)
57         cout<<n-k<<endl;
58     else
59         cout<<a[k]<<endl;
60     system("pause");
61     return 0;
62 }

 

posted @ 2012-08-20 17:47  加拿大小哥哥  阅读(220)  评论(0编辑  收藏  举报