Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 81628 | Accepted: 25682 |
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
Output
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.
题解:大意就是一个人追牛……给你他两的坐标,求那个人追上牛用的最少步数,此人身怀绝技,不仅以向前向后各走一步,而且可以瞬移到他当前坐标的二倍位置……
#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<queue>;
#include<stack>;
#include <iostream>
#include <queue>
#define mem(a) memset(a,0,sizeof(a))
#define MAX 200005
using namespace std;
bool v[MAX]; /*做标记……*/
int n,k;
int d[3]={-1,1,2}; /*他移动的情况总共三种……*/
struct node /*储存位置和移动次数*/
{
int s,ss;
};
int check(int m) /*检查点m是否符合条件且未被标记过……*/
{
if(m<0||m>=MAX||v[m])
return 0;
return 1;
}
void bfs()
{
queue<node>q;
mem(v); /*初始化……*/
node a;
a.s=n,a.ss=0;
v[n]=1;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
if(a.s==k){cout<<a.ss<<endl;return;} /*出口表示已追上他的牛……*/
node g;
g.ss=a.ss+1;
for(int i=0;i<3;i++) /*移动情况就三种……*/
{
if(i==2)
{
if(check(a.s*2))
{
v[a.s*2]=1;g.s=a.s*2;q.push(g);
}
}
else
{
if(check(a.s+d[i]))
{
v[a.s+d[i]]=1;g.s=a.s+d[i];q.push(g);
}
}
}
}
}
int main()
{
while(cin>>n>>k)
{
bfs();
}
}