自带WA自动机属性的ACMer,经常会遇到无限提交然后就是wa的情况,但是就是不知道自己到底哪里出错了。除了cf之类的网站能得到部分数据以外,很难有网站会告诉你数据。所以可以暴力写一发或者找一个正确的cpp文件,产生几组随机数,简单跑几次,,如果出现两者不一样的情况,再做分析。对拍就完成了这么一个功能。
首先,对拍的前提是你的暴力代码是完全正确的,你的随机数产生的数据是完全符合题意的。
以a+b为例,来了解一下最简单的对拍小程序。
先写一个错误的cpp文件,命名为my_cpp。
#includeusing namespace std;int main(){ int a,b,ans; scanf("%d%d",&a,&b); ans=a*b; printf("%d\n",ans); return 0;}
然后,运行此cpp,得到一个.exe文件。
然后写一个正确的cpp文件,命名为test。
#include运行此cpp,同样得到一个.exe文件。using namespace std;int main(){ int a,b; long long ans; scanf("%d%d",&a,&b); ans=a-b; printf("%lld\n",ans); return 0;}
然后写一个产生随机数的cpp,命名为data。
#includeusing namespace std;int main(){ srand(time(0)); int a,b; a=rand()*100,b=rand(); printf("%d %d\n",a,b); return 0;}
得到三个exe文件,将这三个exe文件放在同一个文件夹内。
然后建立一个.txt文件,内容是:
:again data > input.txt my_cpp < input.txt > my_cpp_output.txt test < input.txt > test_output.txt fc biaoda_output.txt test_output.txt if not errorlevel 1 goto again pause注意文件的名称一定要一致。
然后保存此txt,将后缀改为.bat。运行此bat文件。
就会得到这样的结果,错误数据会自动写入input文件中。
还有一种方法,将bat文件写成cpp文件,编译运行得到exe文件,运行exe文件会得到同样的结果。
代码:
#include#include using namespace std; int main() { int t=0; while(1) { system("data.exe > data.txt"); system("my_cpp.exe < data.txt > my_cpp.txt"); system("test.exe < data.txt > test.txt"); if(system("fc test.txt my_cpp.txt")) { t=1; break; } } if(t==0) cout<<"no error"<
linu下的代码:
#!/bin/bashwhile true; do ./data > data.in ./stdstd.out ./Todobe Todobe.out if diff std.out Todobe.out; then printf "AC\n" else printf "Wa\n" exit 0 fidone