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.生成区间随机数: r a n d ( ) % ( L − R + 1 ) + L rand()\%(L-R+1)+L rand()%(LR+1)+L可以生成一个 [ L , R ] [L,R] [L,R]的正整数。小数、字符等同理。

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 第一个文件的绝对路径 第二个文件的绝对路径。

在这里插入图片描述

批处理

如果数据是单组、或者错误数据是一些corner test,很难拍出来。那我们每次都手动生成数据、my.cpp运行数据并输出、std.cpp运行数据并输出… … 这样会很麻烦。这时候就可以用批处理自动化的循环对拍。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    while (true)
    {
        system("rand.exe > test.in");
        system("my.exe < test.in > my.out");
        system("std.exe < test.in > std.out");
        if (system("fc my.out std.out")) //返回非0表示有差异
            system("pause");
    }
    return 0;
}

这样,我们只需先写出rand.exe、std.exe、my.exe,然后执行批处理程序,就可以等待发现差异输入啦

参考资料

  1. OI WIKI 常见技巧
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hesorchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值