【程设课发帖】对拍
当我和室友一起端坐在电脑前,为bug头痛的时候,对拍方法往往会让问题好解决一点。
如果屏幕前的你也有这样的困扰:
- 测试数据过得了,但是保密数据总有几条WA了
- 小数据过得了,大数据过不了,但是自己造大数据很麻烦
- 有bug藏得很深,运行了很多次都没找到
那么,我建议你试一试对拍。
什么是对拍
借用网上博客中的说法,对拍就是你给两个程序,和一个随机数据生成器,然后系统去用这个随机数据生成器的输出作为你这两个程序的输入,然后比较你这两个程序的输出,可以找到一组使这两个程序输出不一样的数据(如果存在的话)。
对拍程序会把这两个不一样的输出“打在公屏上”,你可能根据这个正解和你的WA解,反推出你代码中的问题所在。
怎么写对拍
材料:
my_code.exe, std.exe, data.exe, bat.txt,将它们放在同一个文件夹下。
my_code.exe 是你的代码运行后生成的可执行文件。
std.exe 来自正确代码。它可以是TLE的暴力算法代码,也可以是你室友已经AC过的代码,还能是网上找的AC代码。总之,只要结果是对的就行。
data.exe 来自你写的随机数生成代码,下面会简单介绍怎么写。
接下来如果没看得很明白,推荐看这篇简单易懂的博客https://blog.csdn.net/code12hour/article/details/51252457。毕竟,我的语文不太好。
方法:
1. 随机数生成代码的写法如下。可以根据不同题目输入格式的不同,对其进行修改。
#include<bits/stdc++.h>
using namespace std;
int main(){
srand(time(0));
int a;
a=rand()%100;
printf("%d\n",a);
return 0;
}
2. 对拍程序的写法如下:
:again
data > input.txt
std < input.txt > std_output.txt
my_code < input.txt > my_code_output.txt
fc std_output.txt my_code_output.txt
if not errorlevel 1 goto again
pause
写好后,把后缀名从.txt改成.bat,双击即可运行。
如果要修改,可以右键-编辑。
运行界面
下图就是结果不一致时,我们看到的界面。可以看到,正确答案是7,而被debug的代码错误输出了6。
如果对拍程序一直运行,总是不停下来,就说明它没有拍出你的问题。
如果对拍程序没有拍出你的问题,那么你可以试着改变你造出的随机数的数据范围,或者干脆放弃对拍方法,老老实实地用另外的方法debug——毕竟,对拍只是检验代码的众多方式之一而已。