众所周知,对拍可以有效的判断代码是否正确
一般是以一个暴力的程序(请确保该程序正确)与一个优化的程序来实现
这里以 A+B problem 为例,来说明一下在 Linux 环境下的对拍
先在你写程序的文件夹里新建其代码(记得先编译,每次更改操作之后也要重新编译)
这里以 a+b 为自己写的代码,std 为暴力代码,data 为生成数据,check 就是对拍程序
这里注意 check 文件的后缀是 .sh,终端编译命令是 sh check.sh,其代码如下
#!/bin/bash
while true; do
./data > data.in
./std <data.in >std.out
./*** <data.in >***.out
if diff std.out ***.out; then
printf "AC\n"
else
printf "Wa\n"
exit 0
fi
done
其中 * * * 代表你所写程序的命名,在我们的样例下就是 a+b,
这里的程序不用打 freopen 也可以使用
首先我们看一下我们建数据的代码 data
#include<ctime>//time需要的函数库
#include<cstdlib>//srand需要的函数库
#include<unistd.h>//sleep需要的函数库
#include<iostream>
using namespace std;
int main()
{
srand(time(NULL));
sleep(1);
//保证随机
cout<<rand()<<" "<<rand();//输出两个随机数
return 0;
}
然后我们先写一个错误的 a+b 的代码
#include<iostream>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
if(a>2000000) cout<<a+b+1;
else cout<<a+b;
return 0;
}
很显然这个程序在 a 大于2000000的时候会使答案多1,那么我们看一下我们的结果
前面的是 std 的运算结果,后面为 a+b 的运算结果
确实和我们期待的一样前面的结果比后面的结果大一
那我们将我们的代码改回正确的代码,结果如下
当看到一大片的AC时(希望会有),那么你的优化策略99%是可行的
这时我们就可以Ctrl+Z强行终止我们的 check.sh ,重新进入终端
对拍的模板就讲到这里吧,对拍还是很有用的,能写出暴力的程序建议都对拍一下
最后祝读文的各位 —— 比赛顺利,AC虐场
更新一个好用的Gedit配置,可直接编译运行程序
#!/bin/sh
cd $GEDIT_CURRENT_DOCUMENT_DIR
gnome-terminal -x bash -c "g++ $GEDIT_CURRENT_DOCUMENT_NAME -Wall -o 1 && ./1;read"