一只姓梁的monkey 2022-12-31 12:27 采纳率: 53.8%
浏览 22
已结题

信息学奥赛 抓住那头牛 评测出错

http://ybt.ssoier.cn:8088/problem_show.php?pid=1253
[题目描述]

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000)。农夫有两种移动方式:
1、从X移动到X−1或X+1,每次移动花费一分钟
2、从X移动到2×X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

[输入]

两个整数,N和K

[输出]

一个整数,农夫抓到牛所要花费的最小分钟数

[样例]

输入:5 17

输出:4

解释:从5到17的过程
5 > [-1] > 4 > [*2] > 8 > [*2] > 16 > [+1] > 17

[我的代码]

#include<iostream>
#include<cstdio>
using namespace std;
int UP(int n){return n+1;}
int DOWN(int n){return n-1;}
int FLY(int n){return n*2;}
int n,k,(*F[3])(int)={UP,DOWN,FLY},T=1,W,b[1000001];
struct node
{
    int n,l;
}Q[1000001],l;
int BFS()
{
    W++;
    Q[W].n=n;
    while(T<=W)
    {
        n=Q[T].n;
        l.l=Q[T].l+1;
        T++;
        for(int i=0;i<3;i++)
        {
            l.n=F[i](n);
            if(l.n==k)
            {
                return l.l;
            }
            if(b[l.n]==0 && l.n>=0 && l.n<=100000)
            {
                b[l.n]=1;
                W++;
                Q[W].n=l.n;
                Q[W].l=l.l;
            }
        }
    }
}
int main()
{
    cin>>n>>k;
    cout<<BFS();
}

[错误原因]

测试好好的,提交评测时就[运行时错误]

  • 写回答

1条回答 默认 最新

  • heart_6662 2022-12-31 13:35
    关注

    望采纳!!点击该回答右侧的“采纳”按钮即可采纳!!

    您的代码中似乎并没有明显的语法错误。不过,有几点可以注意:

    在主函数 main 中,变量 W 应该被初始化为 0,而不是 1。因为 W 用来记录队列 Q 的末尾位置,而队列 Q 的第一个元素的位置是 0。

    在 BFS 函数中,当 l.n 等于 k 时,应该直接返回 l.l,而不是 return l.l;。

    在 BFS 函数中,当 l.n 大于 100000 时,应该将 l.n<=100000 改为 l.n<=100000。

    在 BFS 函数中,在循环体末尾应该添加一个大括号,否则会导致代码不能正常编译。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int UP(int n){return n+1;}
    int DOWN(int n){return n-1;}
    int FLY(int n){return n*2;}
    int n,k,(*F[3])(int)={UP,DOWN,FLY},T=1,W,b[1000001];
    struct node
    {
        int n,l;
    }Q[1000001],l;
    int BFS()
    {
        W=0;
        Q[W].n=n;
        while(T<=W)
        {
            n=Q[T].n;
            l.l=Q[T].l+1;
            T++;
            for(int i=0;i<3;i++)
            {
                l.n=F[i](n);
                if(l.n==k)
                {
                    return l.l;
                }
                if(b[l.n]==0 && l.n>=0 && l.n<=100000)
                {
                    b[l.n]=1;
                    W++;
                    Q[W].n=l.n;
                    Q[W].l=l.l;
                }
            }
        }
    }
    int main()
    {
        cin>>n>>k;
        cout<<BFS();
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月31日
  • 已采纳回答 12月31日
  • 修改了问题 12月31日
  • 创建了问题 12月31日

悬赏问题

  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP