Catch That Cow广度优先搜索

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.

来源


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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值