前言
很多时候我们写了一份代码,造了很多数据都没问题,但是提交的时候一直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()%(L−R+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,然后执行批处理程序,就可以等待发现差异输入啦