对拍
0x00
平时练习的时候不停地wa,想不出自己的程序有什么问题,又不想就这样看标程,怎么办?在比赛场上需要验证自己的程序是否正确,又或是想debug又不知道bug在哪?这时候对拍是个很好的技巧
0x01
对拍的原理是 用自己的代码1和能得出正确结果的代码2读入同一个数据,分别输出结果之后,通过windows的批处理文件(bat),对比两结果,若是两个结果不一致,则观察输入输出数据,以此发现代码1的bug,如果结果相同(可能是偶然性),则继续对拍。在这种情况下,代码2不需要能够在题目规定的时间内得出答案,但必须得出的必须是正确答案,一般可以根据题目快速打一个暴力的解法来得到代码2,然后写一个程序用于生成数据,最后写一个bat文件
0x02
例如,检验自己求最值的程序是否正确 设文件名为code1
1 #include<iostream> 2 #include<cstdio> 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<iostream> 2 #include<cstdio> 3 #include<cmath> 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<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cstdlib> 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

浙公网安备 33010602011771号