【ACM对拍程序~】

参考的博客~~~~

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”查看不同即可。

原文地址:https://www.cnblogs.com/hellocheng/p/7421819.html