对拍的写法及作用

对拍是什么

简单来说,对拍是一个用来检查你的代码有没有写错的一个程序
诶,现在有人说了,诶,我不是有样例吗!为什么要用对拍呢!
额,当你下次写大模拟和测大数据的时候发现自己盯着屏幕好久没看出来哪里不一样的时候就老实了。 (doge)

使用对拍需要什么

使用对拍首先需要一个确认已经正确的代码(比如暴力代码)或者当你已经AC此题,想要尝试不同写法时的代码放上去,命名为“ac”

然后,将自己写的新的代码命名为“std”。

然后还需要一个“rand”程序,用于生成此题的随机样例。

对拍的代码

由于对拍只是一个技巧而不是一个题目这里直接放完整代码:

#include<bits/stdc++.h>

const int N = 100;

using namespace std;

int check1(int i)
{
    cout << "check:" << i << endl;
    system("rand.exe > rand.in");
    system("ac.exe < rand.in > a.out");
    system("std.exe < rand.in > b.out");
    int result = system("fc a.out b.out > nul");
    return result;
}

int check2(string a, string b)
{
    string cmd1 = "std.exe < " + a + " > ans.out";
    string cmd2 = "fc " + b + " ans.out > nul";

    system(cmd1.c_str());
    int result = system(cmd2.c_str());
    return result;
}

int main()
{
    int flag = 1;
    cout << "1.自测样例 or 2.跑样例?";
    int x;
    cin >> x;

    if(x == 1)
    {
        cout << "输入测试次数:";
        int num;
        cin >> num;

        for(int i = 1; i <= num; i++)
        {
            if(!check1(i)) continue;
            else
            {
                cout << "WA in : " << i << endl;
                system("cause");
                flag = 0;
                break;
            }
        }
        if(flag == 1) cout << "all test Accepted" << endl;
    }
    else if(x == 2)
    {
        string ain, aout;
        cin >> ain >> aout;
        cout << "输入文件名(带后缀):";
        cin >> ain;
        cout << "输入文件名(带后缀):";
        cin >> aout;
        if(!check2(ain, aout)) cout << "Accepted!" << endl;
        else cout << "Wrong Answer" << endl;
    }
    return 0;
}

这串代码适用于Windows系统,当然,如果要使用Lniux系统,请将代码中的所有“fc”都改成“diff”

对拍的整体逻辑类似于Vjudge的逻辑,将正确代码生成的文件与我们提交的代码的文件进行比对,如果出错,那么就直接返回WA然后退出。

下面用a+b的代码进行举例

ac.cpp代码:

#include<bits/stdc++.h>

#define for_(i,a,b) for(int i=(a);i<=(b);i++)
#define _for(i,a,b) for(int i=(a);i>=(b);i--)

using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;

    cout << a + b;

    return 0;
}

std.cpp代码:

#include <bits/stdc++.h>

#define for_(i, a, b) for (int i = (a); i <= (b); i++)
#define _for(i, a, b) for (int i = (a); i >= (b); i--)
#define LL long long

using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;

    cout << a - (-b) + 1 - 114 + 113 - 1919 + 1919 - 810 + 810;
}

rand.cpp代码:

#include<bits/stdc++.h>

#define for_(i,a,b) for(int i=(a);i<=(b);i++)
#define _for(i,a,b) for(int i=(a);i>=(b);i--)

using namespace std;

int main()
{
    srand(time(NULL));

    int a, b;
    a = rand() % 1000000;
    b = rand() % 1000000;

    cout << a << " " << b;

    return 0;
}

效果:
屏幕截图 2025-05-31 163245

2 个赞

注意 每次运行前请编译

1 个赞

qpzc

1 个赞

@linan04103 如何输出随机生成的数据?

1 个赞

使用rand()函数,注意引用这个函数需要头文件 ctime

1 个赞

或者直接一个万能头

1 个赞

@linan04103 那然后呢?rand.exe 调用然后怎么输出他随机生成的输入?

1 个赞

文件读写

1 个赞

刚学的:_ftime(&t)

1 个赞

@linan04103 不是 diss,是 diff

1 个赞

好的,谢谢

1 个赞

(帖子已被作者删除)

1 个赞

改正一下这里的错误:
string cmd2 = "fc " + b " ans.out > nul";

1 个赞

随机数:

#include<bits/stdc++.h>
using namespace std;
#define random(a,b) ((a)+rand()%((b)-(a)+1))

stringstream ss;

int main( int argc, char *argv[] )
{ 
	int seed=time(NULL);
	if(argc)
	{
		ss.clear();
		ss<<argv[1];
		ss>>seed;
	}
	srand(seed);
	//以上为随机数初始化,请勿修改
	//random(a,b)生成[a,b]的随机整数
	
	//以下写你自己的数据生成代码 
	int k=random(1,10);
	printf("%d\n",k);
	for(int i=0 ; i<k ; ++i)
	{
		printf("%d ",random(1,20));
		printf("\n");
	}
//	int k=random(1,5);
//	printf("%d\n",k);
//		for(int i=0 ; i<k; ++i)
//	{
//		printf("%d\n",random(0,9));
//	}

	return 0;
}

@linan04103
我已经AC了为什么还要检查