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.
示例程序
题目描述
农民约翰被告知逃亡的牛的位置并立即想抓住她。 他从一个点开始,N(0≤N≤100000)在数轴上,牛点K(0≤K≤100000)在同一数轴。 农民约翰有两种运输方式:步行和传送。 *走:FJ可以从任何点X X点X - 1或+ 1在一分钟*传送:FJ可以从任何点X点2×X在一分钟。 如果牛,不知道它的追求,不动,为农民约翰检索需要多长时间吗?
输入
1号线:两个空格分隔的整数:N和K
输出
第1行:最少的时间,在几分钟内,需要对农民约翰抓逃犯牛。
农民约翰被告知逃亡的牛的位置并立即想抓住她。 他从一个点开始,N(0≤N≤100000)在数轴上,牛点K(0≤K≤100000)在同一数轴。 农民约翰有两种运输方式:步行和传送。 *走:FJ可以从任何点X X点X - 1或+ 1在一分钟*传送:FJ可以从任何点X点2×X在一分钟。 如果牛,不知道它的追求,不动,为农民约翰检索需要多长时间吗?
输入
1号线:两个空格分隔的整数:N和K
输出
第1行:最少的时间,在几分钟内,需要对农民约翰抓逃犯牛。
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <queue>
using namespace std;
int n, k;
int visit[200010];
struct node //定义记录每个节点此时的数值和到达此节点的步数
{
int data;
int step;
}t1, t2, temp;
//每次移动都有三种,向前移动一步,向后移动一步,移动到现在位置的两倍
void BFS(int x) //广度优先遍历,调用<queue>,可用数组模拟
{
queue<node>Q;
t1.data = x;
t1.step = 0;
Q.push(t1); //存入传入的节点的数据和步数到队列之中
visit[x] = 1;
while(!Q.empty())
{
t2 = Q.front(); //队头出列,每次都是遍历对头所在的行
Q.pop();
if(t2.data == k) //当对头的节点为k的时候,也就是找到牛的位置,传回步数,跳出BFS
cout << t2.step << endl;
//当向后移动一步
if(t2.data >= 1 && visit[t2.data - 1] == 0) //只有当位置大于等于1的时候才可以后退,并且后退的位置没有被遍历过
{
visit[t2.data - 1] = 1; //标记为遍历
temp.data = t2.data - 1;
temp.step = t2.step + 1;
Q.push(temp); //把此时的节点的数值和步数存入到队列中
}
//当向前移动一步
if(t2.data <= k && visit[t2.data + 1] == 0)
{
visit[t2.data + 1] = 1;
temp.data = t2.data + 1;
temp.step = t2.step + 1;
Q.push(temp);
}
//当移动到当前位置两倍的位置
if(t2.data <= k && visit[2 * t2.data] == 0)
{
visit[2 * t2.data] = 1;
temp.data = 2 * t2.data;
temp.step = t2.step + 1;
Q.push(temp);
}
}
}
int main()
{
while(cin >> n >> k)
{
memset(visit, 0, sizeof(visit));
BFS(n);
}
return 0;
}