NOIP模拟赛 抓牛

【题目描述】

       农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来.

他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有两种办法移动,步行和瞬移:步行每秒种可以让约翰从x处走到x+l或x-l处;而瞬移则可让他在1秒内从x处消失,在2x处出现.然而那只逃逸的奶牛,悲剧地没有发现自己的处境多么糟糕,正站在那儿一动不动.

       那么,约翰需要多少时间抓住那只牛呢?

【输入格式】

仅有两个整数N和K

【输出格式】

最短时间

【样例输入】

5 17

【样例输出】

4

暴力bfs

 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 using namespace std;
 5 
 6 int n,k;
 7 bool vis[500000];
 8 struct data{int x,t;};
 9 data q;
10 
11 int main()
12 {
13     cin>>n>>k;
14     queue<data> Q;
15     Q.push((data){n,0});
16     while(!Q.empty())
17     {
18         q=Q.front();Q.pop();
19         if(vis[q.x]) continue;
20         if(q.x==k) break;
21         vis[q.x]=1;
22         if(q.x<k)
23         {
24             Q.push((data){q.x+1,q.t+1});
25             Q.push((data){2*q.x,q.t+1});
26         }
27         if(q.x)
28             Q.push((data){q.x-1,q.t+1});
29     }
30     cout<<q.t<<endl;
31     return 0;
32 }
原文地址:https://www.cnblogs.com/InWILL/p/6017285.html