C - yh学长的养猪场

这篇博客介绍了yh学长如何利用南瓜老年代步车和超级无敌霹雳豪华完美小巧简易宇宙飞船两种交通工具,寻找在养猪场失踪的最喜爱的小猪“仙子”。问题转化为在一条直线上,通过两种移动方式找出从N点到K点的最短路径。博客提供了一个示例输入和输出,并给出了题解思路,包括使用BFS算法来解决此问题。代码部分展示了具体的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

众所周知,yh学长 is very rich,他靠着玩超级大富翁的游戏富上加富,买下了地球的半座江山(另外半座他不想要啦!)。

Of course,yh学长啥都有,这其中当然也包括养猪场。

这天,yh学长正在养猪场里跟它们一起玩,他心血来潮点了个到:“花花、茉莉、小爱、仙子……???仙子呢?!Where are my dear Xianzi???!!!”
yh学长忽然发现名为“仙子”的小粉猪不见了!Oh no!这可是他最心爱的一头猪!!!
幸好yh学长在每只猪的身上都安装了高级GPS定位导航,通过智能腕表,他可以实时知道“仙子”的位置。

yh学长从一条直线上的一个点N (0 ≤ N ≤ 100,000) 开始,“仙子”在同一直线上的一个点K (0 ≤ K ≤ 100,000) 上。

yh学长迫不及待地想把“仙子”带回来,他决定现在就出发去找它。
可是作为一个 richer ,可选择的交通方式实在是太多了,到底要用什么交通方式去找呢?
yh学长想起“仙子”最爱的两个交通工具—— 南瓜老年代步车 以及 超级无敌霹雳豪华完美小巧简易宇宙飞船。

南瓜老年代步车南瓜老年代步车——yh学长可以在一分钟内从任何一点X移动到X-1或X+1两点。
超级无敌霹雳豪华完美小巧简易宇宙飞船超级无敌霹雳豪华完美小巧简易宇宙飞船——yh学长可以在一分钟内从任何X点移动到2*X点。

已知“仙子”在离家出走一段时间后就反悔了,
十分地想念yh学长(这就是双向奔赴吗(T▽T)磕到了磕到了ヾ(◍°∇°◍)ノ゙),
但它太累了,于是决定在原地不动等yh学长来找它。

请问yh学长至少需要多长时间才能把它找回来?

Input

第一行输入两个整数 N 和 K

Output

输出一个整数——yh学长至少花多长时间才能把“仙子”找回来?

Sample Input

5 17

Sample Output

4

Hint

yh学长到达“仙子”所在地的最快方法是沿着以下路径移动:5-10-9-18-17,这需要4分钟。

题解:

需要两个数组,一个是看他有没有来过,一个去计算他的步数;

用head 跟 next 代表他的开始和第二步 需要用到一个队列 不需要优先即queue <int> q;

用while(!empty())来使他循环 先把用q.front 把值给head 再用q。pop()消掉第一个值

使用一个for包含三个循环 用next作为他的下一步 要注意防止突破极限 使用一个 if 

再用前面提到的标记数组判断next来过没有 

如果来过  用步数数组计算他的步数 即step【head】=step【next】+1;

最后判断这个head是不是等于你的目标

如果等于 return step【head】;

代码:

 #include<iostream>
#include<queue>
using namespace std;
queue<int> q;
bool vis[100005];
int step[100005];
int bfs(int x, int y)
{
    int next,head,i;
    q.push(x);
    vis[x]=true;
    step[x]=0;
    while(!q.empty())
    {
        head=q.front();
        q.pop();
        for(i=0;i<3;i++)
        {
        if(i==0)
         next=head-1;
        else if(i==1)
        next= head+1;
        else
         next=head*2;
        if(next<0||next>100000) //超界限了
         continue;
        if(!vis[next]) 
        {
            vis[next]=true;
            step[next]=step[head]+1;
            q.push(next);
        }
        if(head==y)
        return step[head];    
        }
    }
}
int main()
{
    int x,y;
    cin>>x>>y;
    if(x>=y)
    cout<<x-y<<endl;
    else
    cout<<bfs(x,y)<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值