Catch That Cow
Time Limit: 2000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
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?
输入
Line 1: Two space-separated integers: N and K
输出
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
示例输入
5 17
示例输出
4
提示
poj3278 有链接提示的题目请先去链接处提交程序,AC后提交到SDUTOJ中,以便查询存档。
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.
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.
来源
Description
不得了,xiaoC的农场里跑出来了一只奶牛,这可是让xiaoC很是揪心啊,于是xiaoC立刻放下了手头的工作,想疯狂的奶牛奋力追去,但说来也怪,xiaoC的走法还真有一点特殊,他每一步有两种走法:
步行:xiaoC可以从任何X位置,一步走到X-1或X+1位置
跳跃:xiaoC可以从任意X位置,一步跳跃到2*X的位置
现在我们假设奶牛并没有意识到xiaoC的追来,还在原地傻傻地站着,请你来帮xiaoC计算一下,
他需要多少步,才能把奶牛逮住!!!
Input
每个测试实例为一行,包含两个数据,N和K,N表示xiaoC现在的位置,K表示奶牛的位置,0 ≤ N,K ≤ 100,000
Output
输出xiaoC能逮住奶牛的最少步数,每个测试实例输出一行
#include <iostream>
#include <queue>
#include<cstring>
using namespace std;
queue<int> x;
const int size=100001;
int step[size];
int vis[size];
int BFS(int n, int k)
{
int head, next;
x.push(n); //入队
vis[n] = 1; //标记n已访问
step[n] = 0; //起始步数为0
while (!x.empty())
{
head = x.front(); //取出队头
x.pop(); //弹出队头
for (int i = 0; i < 3; i++)
{
if (i == 0)
next = head-1;
else if (i == 1)
next = head+1;
else
next = head * 2;
if (next > size || next < 0) //越界
continue;
if (!vis[next]) //判重
{
x.push(next); //入队
step[next] = step[head] + 1; //步数+1
vis[next] = 1; //标记节点已访问
}
if (next == k) //找到退出
return step[next];
}
}
}
int main()
{
int n, k;
cin >> n >> k;
memset(vis,0,sizeof(vis));
if (n >= k)
{
cout <<n-k<< endl;
}
else
{
cout <<BFS(n,k)<< endl;
}
return 0;
}