【疑问】好人判断法,但到死不发好人卡
查看原帖
【疑问】好人判断法,但到死不发好人卡
1117784
yeyou26楼主2023/10/22 11:08

关于一个没有return true的函数返回了1这件事

真让人摸不着头脑

这题孩子用的枚举(1e5种可能的答案)

再对每一种可能进行好人判断法

考场调试的时候把每一种情况都输出

后来删调试代码手滑给bool判断函数的return 1删了

即整段代码里没有return 1

(见考场代码judge函数)

考场本地环境和自己电脑本地环境代码却全部正常运行输出正确答案

(即"看起来" bool函数默认返回了1 )

(但经过实验,bool函数默认返回值就是0)

if(judge())
{
	sum++;
}

而无论 洛谷 还是 小图灵 测评理所当然全WA

加上return 1就AC了

爆零只能说自己疏忽了

孩子只是想知道

为什么在本地(包括考场电脑跟自己电脑)

一个没有return 1 的函数能抛出“真”来

附考场代码(在本地可以运行输出正确答案)

#include<bits/stdc++.h>
using namespace std;
int n;
int sum=0;

int p[6];
int pos[10][6];

struct difference
{
    int pos;
    int roleup;
    int roledown;
};

bool judge()//好人判断法 但是到死也不发好人卡(
{
    difference dif[3];
    for(int i=1; i<=n; i++)
    {
        int cnt=0;
        for(int j=1; j<=5; j++)
        {
            if(p[j]!=pos[i][j])
            {
                cnt++;
                if(cnt>=3)return false;
                dif[cnt].pos=j;
                if(p[j]>pos[i][j])dif[cnt].roleup=p[j]-pos[i][j];
                else dif[cnt].roleup=p[j]+10-pos[i][j];
                if(p[j]>pos[i][j])dif[cnt].roledown=p[j]+10-pos[i][j];
                else dif[cnt].roledown=pos[i][j]-p[j];

            }
        }
        if(cnt>2 || cnt==0)
        {
            return false;   
        }
        else
        {
            if(cnt==2)
            {
                if(dif[2].pos-dif[1].pos!=1)
                {
                    return false;
                }
                if((dif[1].roleup!=dif[2].roleup)&&(dif[1].roledown!=dif[2].roledown))
                {
                    return false;
                }
            }
        }
    }
}

int main()
{
    freopen("lock.in","r",stdin);
    freopen("lock.out","w",stdout);
    cin>>n;
  //输入
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=5; j++)
        {
            scanf("%d",&pos[i][j]);
        }
    }
    for(int u1=0; u1<=9; u1++)
    {
        p[1]=u1;
        for(int u2=0; u2<=9; u2++)
        {
            p[2]=u2;
            for(int u3=0; u3<=9; u3++)
            {
                p[3]=u3;
                for(int u4=0; u4<=9; u4++)
                {
                    p[4]=u4;
                    for(int u5=0; u5<=9; u5++)
                    {
                        p[5]=u5;
                        if(judge())//如果函数返回真 说明这种情况是正确答案的一种
                        {
                            sum++;
                        }
                    }
                }
            }
        }
    }
    cout<<sum;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

2023/10/22 11:08
加载中...