关于对拍

知周所众,对拍是一个在比赛中重要的技能之一。

所以,我自制了一个建议的对拍程序,简洁实用(Windows环境)。

原理

对拍原理大致如下:

数据生成器(generator)->程序1->输出1

数据生成器(generator)->程序2->输出2

输出1-对拍-输出2
$\ \ \ \ \ \ \ \ \ \ \ $ |WA
$\ \ \ \ \ \ \ \ \ \ \ $ v
$\ \ \ \ \ $ 保存数据

怎么样,我手敲的流程图好不好看?

代码实现

generator:(根据具体题目修改随机数范围和数量)

#include<iostream>
#include<cstdlib>
#include<ctime>

int main()
{
	std::srand(std::time(nullptr));
	
	int n=std::rand()%5000+1,m=std::rand()%5000+1;
	
	std::cout<<n<<" "<<m<<std::endl;
	return 0;
}

随机生成数据并输出。

test1:(记得修改后要编译)

#include<bits/stdc++.h>
using namespace std;
long long n,m;
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	cout<<n+m<<endl;
	return 0;
}

将你的代码放入这里,这个是瞎写的A+B Problem。

test2:(记得修改后要编译)

#include<bits/stdc++.h>
using namespace std;
long long n,m,a,b;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        a+=1;
    for(int i=1;i<=m;i++)
        b+=1;
    cout<<a+b<<endl;
    return 0;
}

这是你写的暴力代码。

Pair:(不用修改)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int cnt=0;
	
	cout<<"Pair begin."<<endl;
	
	while(cnt<=100)
	{
		system("generator.exe > gen.in");
		system("test1.exe < gen.in > test1.out");
		system("test2.exe < gen.in > test2.out");
		if(system("fc test1.out test2.out > data.log"))
		{
			cout<<"Wrong Answer,";
			cout<<"found at Pair "<<cnt<<endl;
			cout<<"Pair over."<<endl;
			
			system("generator.exe > data.out");
			system("test1.exe < gen.in >> data.out");
			system("test2.exe < gen.in >> data.out");
			system("start data.out");
			return 0;
		}
		cout<<"Pair times:"<<cnt<<endl;
		cnt++; 
	}
	cout<<"Pair over."<<endl;
	cout<<"No WA."<<endl;
	return 0;
}

在这个对拍核心程序中,调用了三个程序的exe文件,将输出放入out文件中,并对比。

我相对于基础对拍程序加入了WA样例的数据显示。将你test1程序WA掉的样例的输入和两个程序不同的输出放到一起,并在找到问题后立刻打开,方便调试。

最终展示

对拍程序(pair)运行时:

未发现错误:

稍微修改了test1,将n+m改为n-m后,运行效果:

可以看到,运行了之后发现错误,对拍终止,并显示WA数据的输入输出(第一行为输入,后两行分别为test1和test2的输出)

效果还算不错,这篇指导推荐人群:了解对拍原理但懒得写代码的人。

posted @ 2024-02-01 23:43  j1hx  阅读(30)  评论(0)    收藏  举报