赞
踩
对拍就是当你写完一个代码 ,你想要验证它是否是正确的
但是单单手造样例或者看题目上的样例往往不一定能发现错误 而且十分繁琐
所以我们可以依靠强大的计算机来帮助我们检验程序的正确性
接下来,讲一下对拍是如何实现的
我们以a+b问题为例
首先std是我们写的程序(可能有错误)
#include <bits/stdc++.h>
using namespace std;
int main()
{ int a,b;
cin >> a >> b;
if (a%20==0)a++;
cout << a+b << endl;
return 0;
}
然后我们再写一个程序bs 一般是暴搜等暴力程序 但一定要确保这个程序是没有错误的
#include <bits/stdc++.h>
using namespace std;
int main()
{ int a,b;
cin >> a >> b;
int ans=0;
while(a--) ans++;
while(b--) ans++;
cout<<ans<<endl;
return 0;
}
我们再写一个数据生成器data, 利用系统里的随机数来生成随机数据
#include <bits/stdc++.h>
using namespace std;
int main()
{ srand(time(0));
int a,b;
a=rand()%100+1,b=rand()%100+1;
printf("%d %d\n",a,b);
return 0;
}
或者
最后我们写一个程序dp.cpp“对拍”,dp.cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{ while(1)
{ system("data.exe > in.txt");
system("std.exe < in.txt > out.txt");
system("bs.exe < in.txt > ans.txt");
if(system("fc out.txt ans.txt")) return 1;
}
return 0;
}
先解释一下上面的代码是什么意思
第7行 就是我们把随机数据生成器生成树数据导入到in.txt里
第8行 我们把in.txt里的数据导入到我们写的更优的但是可能有错误的那个std程序
然后把std程序的结果导入到out.txt里
第9行 我们再按照同样的方式把那个暴力程序跑一边 存储结果到ans.txt
第10行 就是比对out.txt和ans.txt这两个输出数据是否相同
当然我们不能只验证一组数据就完事 ,所以我们一般在前面加上一个while(1)
不停地制造数据进行验证, 直到发现错误
就return 1 也就是异常返回 那个对拍的程序就会自动停止告诉你出现了错误 。
具体的效果图如下
然后我们就发现 我们的a+b程序出现了问题
暴力程序算出的正确答案是39268
而我们写的程序得出的答案是39269 比正确答案多了1
然后我们再回到我们的那个文件夹里瞅一瞅
这时的输入数据是上面的12280和26988
左边是标准答案 右边是我们输出的答案
所以我们再回到原std程序挑错
利用中间输出的方式寻找错误
结果我们就非常惊奇地发现
第8行是发生了什么情况 怎么多了一行这样的代码。。。
至此’ 我们的对拍讲解就结束啦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。