比赛时调程序的奇淫巧技之一:对拍。
程序bug调试不出来,但是能写一个暴力的保证正确的算法,并且直接提交暴力的程序会超时,于是这时候就可以用“对拍”来调试了。
由于ACM ICPC用的系统都是Ubuntu所以给出一个基于Linux的对拍程序(Mac OS X同样适用)
data_maker :你写的能够随机生成数据的程序,注意生成数据的条件(有些题目对数据的要求比较高,这时候很难生成可以用的数据,所以对拍也是有局限性的)
MyProg:你写的高效程序
StdProg:暴力的保证答案正确的程序
while true; do
./data_maker > tmp.in #出数据
./MyProg < tmp.in > my.out #被测程序
./StdProg < tmp.in > std.out #正确(暴力)程序
if diff my.out std.out; then #比较两个输出文件
printf "AC\n" #结果相同显示AC
elif diff -B -b my.out std.out; then
printf "PE\n"
else
printf "WA\n" #结果不同显示WA,并退出
exit 0
fi
done
上面这个程序需要保存成.sh的格式,例如:对拍.sh直接在终端里面运行
运行方法:
打开终端 执行
方法一: 输入命令 ./aa.sh
方法二:直接把 aa.sh 拖入到终端里面。
注意事项:
如果 没有成功报出问题:: Permission denied。
就是没有权限。
解决办法:修改该文件对拍.sh 的权限 :使用命令: chmod 777 对拍.sh 。
然后再执行 上面第一步或者第二步的操作就 OK 了.
附赠一个windows的对拍程序(转载于他人,侵删):对拍.bat
对拍程序的写法 如下
@echo off :
loop
datamaker #数据生成器 rand.exe > data.in 这里的大于符号,小于符号为重定向符号
std #标准程序 std.exe < data.in > std.out
myprogram #my.exe < data.in > my.out 我的程序
fc ans.out std.out //比较两个程序的输出是否一致,一致则返回0
if not errorlevel 1 goto loop
pause
goto loop
#最后上边的 内容 保存为.
bat文件
#rand.exe std.exe my.exe 以及windows下的这个 .bat文件
放在同一个目录下***************************************************************************************************
这里数据生成器: 就是你自己编写一个应用程序 rand.exe,这个应用程序就是随机的生成一组符合题意的输入数据并存放到上边提到的 输入数据文件中data.in高效程序:就是上边提到的 高效算法 写的程序,即 my.exe
暴力程序 :就是指能够保证所有输入数据都能输出正确结果的 程序,即这里的std.exe上边的.
bat文件的功能就是循环 判断高效程序和 暴力程序 在同样的输入数据情况下,输出数据是否相同,从而实现了对拍程序的功能