盈皓天 2024-09-10 13:31 采纳率: 50%
浏览 4

csp贪吃蛇为啥是错的呢

csp的贪吃蛇代码如下

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=1e6+100,INF=1e9;
struct Node
{
    int val,num;
    #define val(i) a[i].val
    #define num(i) a[i].num
    bool operator < (const Node y)
    {
        return val==y.val?num<y.num:val<y.val;
    }
    bool operator == (const Node y)
    {
        return val==y.val && num==y.num;
    }
}a[N];
int T,n,k,ph,pb;
queue<Node> q;
Node blank={0,0},black={INF,INF};
Node Max(Node x,Node y)
{
    return (x<y)?y:x;
}
Node Min(Node x,Node y)
{
    return (x<y)?x:y;
}
bool query(Node la)
{
    int cnt=0;
    Node bk=Min(pb<ph?a[pb+1]:black,q.size()?q.back():black);
    while(1)
    {
        Node hd=Max(pb<ph?a[ph]:blank,q.size()?q.front():blank);
        if(a[ph]==hd)
            ph--;
        else
            if(q.size())
                q.pop();
        if(hd==bk)
            break;
        hd.val-=la.val;
        if(bk<hd)
            break;
        la=hd;cnt++;
    }
    return cnt&1;
}
int main()
{
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        if(i==1)
        {
            scanf("%d",&n);
            for(int j=1;j<=n;j++)
                scanf("%d",&val(j)),num(j)=j;
        }
        else
        {
            scanf("%d",&k);
            for(int j=1,x,y;j<=k;j++)
            {
                scanf("%d%d",&x,&y);
                val(x)=y;
            }
        }
        ph=n,pb=1;
        while(q.size())
            q.pop();
        while(pb<=ph)
        {
            Node x=Max((ph>pb)?a[ph]:blank,q.size()?q.front():blank);
            if(a[ph]==x)
                ph--;
            else
                q.pop();
            x.val-=val(pb);
            if(x<a[pb+1] && n-pb>1)
            {
                if(query(x))
                    pb++;
                break;
            }
            q.push(x);pb++;
        }
        printf("%d\n",n-pb+1);
    }
    return 0;
}

为什么只得了74.5分呢!?

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-10 19:00
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的代码实现了一个基于CSP(约束满足问题)的贪吃蛇游戏。但是,有几个问题和潜在的错误可能导致你的代码得分不高:

    1. 逻辑错误:你的代码在处理蛇的移动和食物更新时逻辑可能存在问题。特别是query函数中的逻辑判断和循环条件可能需要重新检查。你需要在代码中明确每一步的操作,并确保它们是正确的。比如,每次蛇移动时是否应该减少对应的数值?蛇何时会吃到食物?食物是如何更新的?这些逻辑都需要仔细考虑和验证。
    2. 数据结构使用不当:在你的代码中,使用了队列q来存储节点信息,但在某些情况下可能使用不当或不合理。你需要确保队列中的元素始终是有意义的,并且按照正确的顺序入队和出队。
    3. 边界条件和特殊情况处理不足:在某些情况下,例如蛇头和食物重叠时,你的代码可能没有正确处理这种情况。此外,当蛇达到边界时应该如何处理?这些边界条件和特殊情况都需要仔细处理。
    4. 代码可读性和可维护性:你的代码在某些地方使用了宏定义(例如val(i)num(i)),虽然这在某些情况下可以提高代码效率,但可能会降低代码的可读性和可维护性。建议使用更具描述性的变量名和函数名来提高代码的可读性。
    5. 输入处理可能存在问题:在处理输入时,你需要确保正确地读取和处理每一个输入值,避免可能的错误或遗漏。

    为了解决这个问题,我建议你逐步调试你的代码,检查每一步的输出和状态是否符合预期。你可以使用单元测试或小规模输入来验证你的代码逻辑是否正确。此外,你还可以参考其他成功的解决方案或寻求他人的帮助来找出你的代码中的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月10日