一个玄学的bug
查看原帖
一个玄学的bug
125429
SfumatoCannon_楼主2022/10/1 16:25
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
#define MAXN 12
int n;
struct Cow
{
    int cowFriend[3];//id of friends
    int pos;
}cow[MAXN+1];
int cowId[MAXN];
int ans;
void swapCow(int x,int y)
{
    int temp=cow[y].pos;
    cow[y].pos=cow[x].pos;
    cow[x].pos=temp;
    cowId[cow[x].pos]=x;
    cowId[cow[y].pos]=y;
}
int f()
{
    int i,j;
    int res=0;
    for (i=1;i<=n;i++)
    {
        for (j=0;j<3;j++)
        {
            res+=abs(cow[i].pos-cow[cow[i].cowFriend[j]].pos);
        }
    }
    return res/2;
}
void work()
{
    double T=3000;
    double delta_T=0.998;
    int ans_new,x,y;
    while (T>1e-10)
    {
        do
        {
            x=rand()%n+1;
            y=rand()%n+1;
        }while (x==y);
        swapCow(x,y);
        ans_new=f();
        if (ans_new<ans)
        {
            ans=ans_new;
        }
        else
        {
            if (exp((ans-ans_new)/T)*RAND_MAX>rand())
                ans=ans_new;
            else
            {
                swapCow(x,y);
            }
        }
        T*=delta_T;
    }
}
int main()
{
    srand(12345678);
    srand(rand());
    scanf("%d",&n);
    int i;
    for (i=1;i<=n;i++)
        cowId[i]=i;
    for (i=1;i<=n;i++)
    {
        scanf("%d%d%d",&cow[i].cowFriend[0],&cow[i].cowFriend[1],&cow[i].cowFriend[2]);
        cow[i].pos=i;
    }
    ans=f();
    work();
    printf("%d\n",ans);
    return 0;
}

这段代码只能得65分,下载数据并本地运行后发现出错的数据输出了一个极小的ans。(答案是42,本地输出10)

work函数中所有ans=ans_new;的下一行都加上if(ans==10)printf("*");,主函数中的ans=f();的下一行也加上。运行程序,发现ans仍然输出10,但没有输出任何星号。

百思不得其解下,把第14行的int ans;改为int ans=1000;,再次提交,居然过了??本地的输出也变正常了。

为什么会这样?在进行work()函数之前,明明已经初始化ans=f()了,而且之前的代码(包括f()函数)也没有涉及任何和ans有关的东西啊

黑人问号.jpg

2022/10/1 16:25
加载中...