赞
踩
通过读入一系列测试数据,用两个程序分别运行出结果,比较两个程序运行结果的差异。
在ACM比赛时,我们经常会遇到一个问题,就是你写了一份代码,信心满满地submit,结果返回的总是WA,而且你也找不出什么测试样例能把自己的代码叉掉,那个这个时候如果条件允许的话(比如题目可以写个小范围暴力等等得到必定正确的结果),可以试着用对拍。
比起手动对拍,写个对拍程序效率比较高,每次能比较大量的数据。
我们随便以一道题为例进行解释。
在一个磁盘中建立一个对拍文件夹(我选择C盘,但哪个盘无所谓)。
首先我们在文件夹里新建一个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')得到。
先新建一个AC.txt,然后用一个一定正确的程序跑出结果并储存。
建议输出结果时加上读入数据,这样如果结果不一样可以很快知道是哪组测试数据出错。
先新建一个WA.txt,然后用WA的程序跑出结果并储存。
进行好上面几步后文件夹里就出现了三个txt文档,里面就是相应的数据了,当然你肉眼去找差异效率就比较低且易找错,所以我们继续操作。
新建一个result.txt,用以进行对拍。
打开文档,输入以下语句并保存。
然后把文档的拓展名从txt改为bat,运行便能得到对拍结果啦。(如有问题见文末)
这样就比较清楚地可以看到问题出在哪组数据了。
如果比较后没有问题,则会返回找不到差异
【PS】如果你把文档的拓展名改了后,图标依旧没有改变,那么你需要进行进行以下操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。