首页 > 技术文章 > 对拍学习笔记

Dregen-Yor 2021-11-14 21:05 原文

对拍是什么?

对拍是什么呢?

对拍就是你给两个程序,和一个随机数据生成器,然后系统去用这个随机数据生成器的输出作为你这两个程序的输入,然后比较你这两个程序的输出,可以找到一组使这两个程序输出不一样的数据(如果存在的话)

怎么对拍呢?

首先,新建一个文件夹。至于这个文件夹叫什么,在哪里都无所谓。

在这个文件夹下加入你生成数据的程序data.exe,你的程序test.exe,标程或者暴力std.exe

上面提到的程序该怎么写呢?

data.exe一般都是通过随机数函数来生成数据,下面是个例子。

data.cpp

#include<iostream>//输入输出 
#include<ctime>//time() 
using namespace std;
int main(){
    srand(time(NULL));
    //比如生成一个长度随机的10000以内序列,输出长度n与ai~an 
    int n=rand()<<15|rand();//这样造出的rand数更随机
    cout<<n<<endl;
    while(n--){
        cout<<(rand()<<15|rand())%10000<<' ';
        //cout<<(rand()<<15|rand())%10000+1<<' ';
        //保证数据在[0,9999]。如果要[1,10000],就用第二行的 
    }
    return 0;
}

暴力及自己的程序这里就不提了下面看最重要的对拍。

对拍.cpp

#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
	//int t=200;
    while(1)
    {
//    	t--;
        system("data.exe > data.txt");
        system("std.exe < data.txt > std.txt");
         system("test.exe < data.txt > test.txt");
        if(system("fc test.txt biaoda.txt"))   break;
    }
    if(t==0) cout<<"no error"<<endl;
    else cout<<"error"<<endl;
    //system("pause");
    return 0;
}

如果感觉比较麻烦还可以这样写

对拍.bat

:again
data>in.txt
std<in.txt>stdout.txt
test<in.txt>testout.txt
fc stdout.txt testout.txt
if not errorlevel 1 goto again
pause

data,std,test都是取决于exe的文件名的。系统会先用你的data.exe生成一个in.txt,再用in.txt作为输入传给test.exe和std.exe,运行后会得到stdout.txt,testout.txt。

比较无差异就会一直进行下去,直到出现差异就pause,文件夹中会有这个错误点的in.txt,testout.txt,stdout.txt。


如果一直无差异可能你就已经A了这道题!

但数据范围要把控好。

综上。完。

推荐阅读