【题解】[Usaco2007 Open]Catch That Cow 抓住那只牛-C++

题目
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?

农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上幽发,尽快把那只奶牛抓回来,他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有两种办法移动,步行和瞬移:步行每秒种可以让约翰从x处走到x+1或x-1处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的奶牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动.那么,约翰需要多少时间抓住那只牛呢?
Input

Line 1: Two space-separated integers: N and K
仅有两个整数N和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
Farmer John starts at point 5 and the fugitive cow is at point 17.
Sample Output
4
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.
思路
这道题依然是一个BFS,可以拓展三种状态:-1,+1或*2,但是要添加一些判断使得不会让标记数组越界导致RE(我死了很多次!!!)
其他的就是模板了…

代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,k;
 4 bool vis[10000010];
 5 struct node
 6 {
 7     int x,s;
 8 };
 9 void bfs()
10 {
11     queue<node> q;
12     vis[n]=1;
13     int tx;
14     q.push((node){n,0});
15     while(!q.empty())
16     {
17         node now=q.front();
18         //q.pop();
19         if(now.x==k)
20         {
21             cout<<now.s<<endl;
22             exit(0);
23         }
24         tx=now.x-1;
25         if(tx>=0)
26         if(!vis[tx])
27         {
28             q.push((node){tx,now.s+1});
29         }
30         if(tx>2*k)continue;
31         tx=now.x+1;
32         if(!vis[tx])
33         {
34             q.push((node){tx,now.s+1});
35             vis[tx]=1;
36         }
37         tx=now.x*2;
38         if(!vis[tx])
39         {
40             q.push((node){tx,now.s+1});
41             vis[tx]=1;
42         }
43     }
44 }
45 int main()
46 {
47     cin>>n>>k;
48     bfs();
49     cout<<"这组数据无解"<<endl;//打着玩的
50     return 0;
51 }

 

posted @ 2019-07-19 15:38  摸鱼酱  阅读(583)  评论(0编辑  收藏  举报