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