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 }

 

你可能感兴趣的:(poj)