自带WA自动机属性的ACMer,经常会遇到无限提交然后就是wa的情况,但是就是不知道自己到底哪里出错了。除了cf之类的网站能得到部分数据以外,很难有网站会告诉你数据。所以可以暴力写一发或者找一个正确的cpp文件,产生几组随机数,简单跑几次,,如果出现两者不一样的情况,再做分析。对拍就完成了这么一个功能。
首先,对拍的前提是你的暴力代码是完全正确的,你的随机数产生的数据是完全符合题意的。
以a+b为例,来了解一下最简单的对拍小程序。
先写一个错误的cpp文件,命名为my_cpp。
#include<bits/stdc++.h>
using 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<bits/stdc++.h>
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,同样得到一个.exe文件。
然后写一个产生随机数的cpp,命名为data。
#include<bits/stdc++.h>
using 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<iostream>
#include<windows.h>
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"<<endl;
else cout<<"error"<<endl;
getchar();
return 0;
}
linu下的代码:
#!/bin/bash
while true; do
./data > data.in
./std <data.in >std.out
./Todobe <data.in >Todobe.out
if diff std.out Todobe.out; then
printf "AC\n"
else
printf "Wa\n"
exit 0
fi
done