对拍程序简介
一、对拍程序的用途
通过读入一系列测试数据,用两个程序分别运行出结果,比较两个程序运行结果的差异。
二、什么时候用对拍
在ACM比赛时,我们经常会遇到一个问题,就是你写了一份代码,信心满满地submit,结果返回的总是WA,而且你也找不出什么测试样例能把自己的代码叉掉,那个这个时候如果条件允许的话(比如题目可以写个小范围暴力等等得到必定正确的结果),可以试着用对拍。
三、对拍程序的优点
比起手动对拍,写个对拍程序效率比较高,每次能比较大量的数据。
四、对拍程序的写法
我们随便以一道题为例进行解释。
1. 新建文件夹
在一个磁盘中建立一个对拍文件夹(我选择C盘,但哪个盘无所谓)。
2. 生成测试数据
首先我们在文件夹里新建一个data.txt文档用以储存测试数据。
根据题意,y的范围为[1000,3000],m的范围为[1,12],x的范围为[0,9]。
我们知道可以调用库函数rand()随机产生一个int型整数,那么如何随机生成一个范围内的随机数呢,我们想到用模运算。
如果需要随机生成区间[x,y]内的数,可以用这样的语句来实现
printf("%d\n",x+rand()%(y-x+1));
生成后输出即可(见代码)
#include <cstdio>
#include <cstring>
//*************** 对拍程序必备
#include <ctime>
#include <cstdlib>
//***************
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1005;
const ll mod = 1e9+7;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
int main()
{
freopen("c://duipai//data.txt","w",stdout); //文件打印语句
srand(time(NULL)); //必不可少
int testcase=100; //测试数据组数,几百就差不多了
while(testcase--)
{
int y=1000+rand()%(3000-1000+1);
int m=1+rand()%(12-1+1);
int x=0+rand()%(9-0+1);
printf("%d %d %d\n",y,m,x);
}
return 0;
}
【PS】
如果要生成小数,可用以下语句
printf("%.2f\n",rand()*1.0/100);
如果要生成字符串,每个字符可以通过先生成[0,25]的整数,然后再加上 'a'('A')得到。
3. 生成正确结果
先新建一个AC.txt,然后用一个一定正确的程序跑出结果并储存。
建议输出结果时加上读入数据,这样如果结果不一样可以很快知道是哪组测试数据出错。
4. 生成错误结果
先新建一个WA.txt,然后用WA的程序跑出结果并储存。
进行好上面几步后文件夹里就出现了三个txt文档,里面就是相应的数据了,当然你肉眼去找差异效率就比较低且易找错,所以我们继续操作。
5. 新建对拍文档
新建一个result.txt,用以进行对拍。
打开文档,输入以下语句并保存。
然后把文档的拓展名从txt改为bat,运行便能得到对拍结果啦。(如有问题见文末)
这样就比较清楚地可以看到问题出在哪组数据了。
如果比较后没有问题,则会返回找不到差异
【PS】如果你把文档的拓展名改了后,图标依旧没有改变,那么你需要进行进行以下操作。
- 打开文件资源管理器(我的电脑)。
- 点击左上角的“查看”,然后点击下拉菜单右侧的“选项”。
- 点击“查看”,然后在高级选项里找到“隐藏已知文件的拓展名”,取消勾选就可以了。