天天看点

ACM程序对拍

前言

很多时候我们写了一份代码,造了很多数据都没问题,但是提交的时候一直Wrong Answer,这时候我们就可以用对拍来快速查找错误的数据。

原理

造出大量的随机数据,用正确代码和你的代码跑这些数据,对比输出的不同。

实现

文件基础:

  • rand.cpp:一份能造合法的随机数据的代码
  • std.cpp:一份可以保证答案正确性的代码
  • my.cpp:一份你的WA的代码
  • rand.out:存放rand.cpp运行后生成的合法的随机数据
  • std.out:使用std.cpp跑rand.out中的数据后生成的输出
  • my.out:使用my.cpp跑rand.out中的数据后生成的输出

需掌握的知识:

1.输入输出重定向(相关链接),也就是文件读写:

freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
           

2.生成区间随机数:a+rand()%(b-a+1)可以生成一个 [ a , b ] [a,b] [a,b]的正整数。

int get(int l, int r) //闭区间
{
    return l + rand() % (r - l + 1);
}
int main()
{
    srand(time(NULL));
    for (int i = 1; i <= 100; i++)
        cout << get(1, 100) << endl;
    return 0;
}
           

3.Windows下cmd中使用FC命令详细对比两个文件相似之处(相关链接):打开cmd命令行,输入FC 第一个文件的绝对路径 第二个文件的绝对路径。

ACM程序对拍

这样,我们只需先写一份rand.cpp,运行出多组合法数据,再用std.cpp和my.cpp分别跑这些数据,最后用windows cmd中的FC命令比对两个文件不一样的地方,rand.out中对应的数据就是Wrong Answer的数据啦