对拍
对拍
这不是个算法,这是个方法。每当你刷毒瘤题的时候,你WA了一天,实在找不出一个能卡死自己代码的数据,这时候,你就需要对拍。
对拍需要的东西(所有程序不需要文件输入输出):
1.你的程序(就是你的错误程序)
2.正确程序(题解中的标答 或 会TLE的正确暴力代码)
3.数据程序(能随机生成输入数据的程序,刚开始先把数据搞小一些,如果拍不出错就调大数据)
4.对拍程序(能组织一切的领导者程序):
程序中的文件名根据你的程序的名字而定。
一个对拍程序一次能多次执行对拍,最多只能发现一个能卡死你的程序的数据
#include <bits/stdc++.h>
using namespace std;
int main(){
while(1+1==2){ //只要不发现你的代码错误就一直找
system("data.exe>data.txt");
//运行data.cpp,把输出放到data.txt文本文档中
system("3311biaoda.exe<data.txt>3311biaoda.txt");
//运行正确程序3311biaoda.cpp,输入data.txt文本文档中的输入数据,把输出放到3311biaoda.txt文本文档中
system("3311.exe<data.txt>3311.txt");
//运行你的程序3311.cpp,输入data.txt文本文档中的输入数据,把输出放到3311.txt文本文档中
if(system("fc 3311.txt 3311biaoda.txt")){
//对比两个文本文档,如果不一样返回true
puts("WA"); //发现你的代码错误
break;
} else puts("AC");//这个数据通过
}
return 0;
}
都写好后,把这些程序都放到一个文件夹中。再依次点开文件夹中的程序(如果你直接执行你写的程序会找不到文件)。 然后你运行 \(\texttt{duipai.cpp}\),会这样:
然后你等待一个 \(\texttt{WA}\) 出来,如果你的数据过小,可能要等几个小时;如果你的过大,可能虽然找到了你的程序过不了的数据,你也看不出为什么错了。
\(\texttt{WA}\) 长这个样:
这时候,你打开文件夹(就是你把程序都放哪儿的那个文件夹),它会变成这个样:
然后你打开 \(\texttt{data.txt}\),就是你的程序过不了的数据。比如会长下面这个样(随你的题目而变):
然后一次对拍就结束了。如果你觉得这个样例不合适或者这个样例你已经能过了,你就再执行一次 \(\texttt{duipai.cpp}\),再等一个 \(\texttt{WA}\),然后再打开一次 \(\texttt{data.txt}\)。
祝大家学习愉快!