Catch That Cow
* 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
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2717
Problem 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.
这道题本来很简单,叫我想复杂了,o(╯□╰)o囧啊。。。。
没想到暴力BFS就可以过。
我还在想 VIS数组是否有优化的选择,比如 用终点和当前点的距离差做标准等。。。
结果一直超内存。。。
后来,想干脆暴搜一次看看,
结果因为,我判断没写函数,直接判断,
if(vis[k.x]==0 && k.x>=0 && k.x<=100000)
因为if里的顺序问题,一直越界错误。。。(应该让判断范围在 判断数组内容前面)
然后又因为判断与0,100000 落了等号。。又WA一次。。
这个简单的题目,悲剧了好长时间。。。想哭了的说。。。
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
int finish;
bool vis[100011];
struct Coor
{
int x,step;
};
bool judge(int x)
{
if(x<0 || x>100000) return 0;
if(vis[x]==1) return 0;
return 1;
}
int bfs(int start)
{
memset(vis,0,sizeof(vis));
queue <Coor> q;
Coor t,k;
vis[start]=1;
t.x=start;
t.step=0;
q.push(t);
while(!q.empty())
{
t=q.front();
q.pop();
if(t.x==finish) return t.step;
k.x=t.x+1;
if(judge(k.x))
{
k.step=t.step+1;
vis[k.x]=1;
q.push(k);
}
k.x=t.x-1;
if(judge(k.x))
{
k.step=t.step+1;
vis[k.x]=1;
q.push(k);
}
k.x=t.x*2;
if(judge(k.x))
{
k.step=t.step+1;
vis[k.x]=1;
q.push(k);
}
}
return -1;
}
int main()
{
int start;
while(cin>>start>>finish)
{
cout<<bfs(start)<<endl;
}
return 0;
}