对拍

 0x00

  平时练习的时候不停地wa,想不出自己的程序有什么问题,又不想就这样看标程,怎么办?在比赛场上需要验证自己的程序是否正确,又或是想debug又不知道bug在哪?这时候对拍是个很好的技巧

 0x01

  对拍的原理是 用自己的代码1和能得出正确结果的代码2读入同一个数据,分别输出结果之后,通过windows的批处理文件(bat),对比两结果,若是两个结果不一致,则观察输入输出数据,以此发现代码1的bug,如果结果相同(可能是偶然性),则继续对拍。在这种情况下,代码2不需要能够在题目规定的时间内得出答案,但必须得出的必须是正确答案,一般可以根据题目快速打一个暴力的解法来得到代码2,然后写一个程序用于生成数据,最后写一个bat文件

  0x02

  例如,检验自己求最值的程序是否正确 设文件名为code1

 1 #include
 2 #include
 3 using namespace std;
 4 
 5 int max(int a,int b)
 6 {return a>b?a:b;}
 7 
 8 int main()
 9 {
10 int x,y;
11 scanf("%d%d",&x,&y);
12 printf("%d",max(x,y));
13 return 0;      
14 }

  然后此时快速写一个结果必定正确的代码2,文件名为code2,这里直接引用cmath的max函数

 

 1 #include 
 2 #include
 3 #include
 4 using namespace std;
 5 
 6 int a,b;
 7 
 8 int main()
 9 {
10     scanf("%d%d",&a,&b);
11     printf("%d",max(a,b));
12     return 0;
13 }

 

  然后再写一个生成检验数据的程序 设文件名为data(生成两个范围在[0,maxn)的数)

 1 #include 
 2 #include
 3 #include
 4 #include 
 5 #define maxn 500010
 6 
 7 using namespace std;
 8 
 9 
10 int main()
11 {
12     srand((int)time(0));
13     int a=rand()%maxn,b=rand()%maxn;
14     printf("%d %d",a,b);
15     return 0;
16 }

 0x03

  在文件夹内新建一个txt文件,然后打对拍的代码

@echo off
:again
data > in.txt      //生成数据
code1 < in.txt > out1.txt    //用code1读入数据,输出结果
code2 < in.txt > out2.txt    //用code2读入数据,输出结果
fc out1.txt out2.txt    //比较out1.txt 和out2.txt
if not errorlevel 1 goto again  //如果输出两结果相同,则继续生成下一组数据,继续测试
pause                          //如果输出两个不同的结果,停止对拍

  最后把这个对拍的txt文件的后缀名改成bat,运行,如果出现结果不同,即可查看输入输出数据来debug

你可能感兴趣的:(对拍)