参考的博客~~~~
http://blog.csdn.net/wlx65003/article/details/51149196
新建一个批处理文件,右键新建一个文本文档,重命名为“对拍程序.bat”。(注意,平时windows是隐藏了文件后缀名的,我们需要在图片所示的位置把隐藏的文件后缀名显现再重命名)
右键编辑,输入以下代码。
rand.exe是数据生成程序,my.exe是自己有问题的程序,std.exe是别人的AC程序(等会再具体实现)。
@echo off 关掉输入显示,防止刷屏。
:loop是定位标记点,类似于c语言的goto语句。
%random%是windows自带的随机数据发生器,可以在命令行里调用,速度比time(NULL)快,(time(NULL)一秒更新一次)。
> data.in是将生成的随机数据重定向到一个文件。
my.exe <data.in>my.out 是把文件data.in输入到my.exe,再把my.exe的输出重定向到文件my.out,下一行同理
fc may.out std.out是为了比较my.out 和 std.out,windows自带的比较命令fc(file compare)。如果标程和自己的程序数据有差异,会显示。
if not errorlevel 1 goto loop 如果fc返回的不是1(fc会在文件不同时返回1,相同时返回0),就会跳到:loop继续循环
pause暂停,fc返回1时,循环暂停,这时可以看是哪个数据出了问题。
goto loop,看完出问题的数据以后,按任意键,继续循环。
@echo off :loop rand.exe %random%> data.in my.exe < data.in >my.out std.exe <data.in >std.out fc my.out std.out if not errorlevel 1 goto loop pause goto loop
生成数据。这里我是根据hdu2639 01背包的第k个最优解的题目条件写的随机生成数据代码。
#include<bits/stdc++.h> using namespace std; #define random(a,b) ((a)+rand()%((b)-(a)+1)) //random(a,b)是生成[a,b]之间的随机数据 stringstream ss;//把字符串转为整数 int main(int argc,char *argv[])//argc是参数个数,*argv[]是参数表,从1开始 { int t = time(NULL); if(argc)//如果有参数 { ss.clear(); ss<<argv[1]; ss>>t;//把参数转换成整数传给t } srand(t); //以下是自己写的数据生成代码 printf("1 "); int n = random(1,5); int v = random(1,100); int k = random(1,30); printf("%d %d %d ",n,v,k); for(int i = 0; i < n; i ++) printf("%d ",random(1,10)); printf(" "); for(int i = 0; i < n; i ++) printf("%d ",random(1,10)); printf(" "); return 0; }
最后只需要把自己的程序my.cpp和标程std.cpp和rand.cpp在同一目录下编译运行s生成my.exe,std.exe,rand.exe,再双击“对拍程序.bat”查看不同即可。