Catch That Cow
| Time Limit: 2000MS | Memory Limit: 65536K | |
|---|---|---|
| Total Submissions: 58054 | Accepted: 18053 |
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
思路:既然我们要找位置的,所以必然涉及到当前位置和步数的问题,所以可以设一个结构体,里面有数据步数和位置,然后搜索,当遇到m时,记录下最短时间,当在不断收索时,遇到比当前最优的时间还多的应立即跳出,位置的标记也是优化的一种形式。
#include <iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int n,m;
struct node
{
int x,ans;
} ;
int vis[1000010],mi;
int jx[]={-1,1};
void bfs()
{
queue<node>q;
memset(vis,0,sizeof(vis));
node f1,f2;
int i,j,a;
f1.x=n,f1.ans=0;
q.push(f1);
mi=0x3f3f3f3f;
while(!q.empty())
{
f1=q.front();
q.pop();
if(f1.x==m)
{
if(mi>f1.ans)
{
mi=f1.ans;
continue;
}
}
if(f1.ans>=mi)
continue;
for(i=0;i<3;i++)
{
f2=f1;
if(i==2)
f2.x=f2.x*2;//这里与i==1||i==0时都要改变f2.x的值,而不是设一个新值,因为还要把此数压入栈内
else
f2.x=f2.x+jx[i];
if(f2.x>=0&&f2.x<=100000&&vis[f2.x]==0)
{
vis[f2.x]=1;
f2.ans++;
q.push(f2);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);//注意写上加速语句防TLE
while(cin>>n>>m)
{
if(n==m)
printf("0\n");
else
{
bfs();
cout<<mi<<endl;
}
}
return 0;
}