知周所众,对拍是一个在比赛中重要的技能之一。
所以,我自制了一个建议的对拍程序,简洁实用(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的输出)
效果还算不错,这篇指导推荐人群:了解对拍原理但懒得写代码的人。
标签:test1,std,test2,int,关于,include,out From: https://www.cnblogs.com/j1hx-oi/p/18002375