关于对拍
知周所众,对拍是一个在比赛中重要的技能之一。
所以,我自制了一个建议的对拍程序,简洁实用(Windows环境)。
原理
对拍原理大致如下:
数据生成器(generator)->程序1->输出1
数据生成器(generator)->程序2->输出2
输出1-对拍-输出2
怎么样,我手敲的流程图好不好看?
代码实现
generator:(根据具体题目修改随机数范围和数量)
#include<iostream> #include<cstdlib> #include<ctime> int main() { std::srand(std::time(nullptr)); int n=std::rand()%5000+1,m=std::rand()%5000+1; std::cout<<n<<" "<<m<<std::endl; return 0; }
随机生成数据并输出。
test1:(记得修改后要编译)
#include<bits/stdc++.h> using namespace std; long long n,m; int main() { ios::sync_with_stdio(false); cin>>n>>m; cout<<n+m<<endl; return 0; }
将你的代码放入这里,这个是瞎写的A+B Problem。
test2:(记得修改后要编译)
#include<bits/stdc++.h> using namespace std; long long n,m,a,b; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) a+=1; for(int i=1;i<=m;i++) b+=1; cout<<a+b<<endl; return 0; }
这是你写的暴力代码。
Pair:(不用修改)
#include<bits/stdc++.h> using namespace std; int main() { int cnt=0; cout<<"Pair begin."<<endl; while(cnt<=100) { system("generator.exe > gen.in"); system("test1.exe < gen.in > test1.out"); system("test2.exe < gen.in > test2.out"); if(system("fc test1.out test2.out > data.log")) { cout<<"Wrong Answer,"; cout<<"found at Pair "<<cnt<<endl; cout<<"Pair over."<<endl; system("generator.exe > data.out"); system("test1.exe < gen.in >> data.out"); system("test2.exe < gen.in >> data.out"); system("start data.out"); return 0; } cout<<"Pair times:"<<cnt<<endl; cnt++; } cout<<"Pair over."<<endl; cout<<"No WA."<<endl; return 0; }
在这个对拍核心程序中,调用了三个程序的exe文件,将输出放入out文件中,并对比。
我相对于基础对拍程序加入了WA样例的数据显示。将你test1程序WA掉的样例的输入和两个程序不同的输出放到一起,并在找到问题后立刻打开,方便调试。
最终展示
对拍程序(pair)运行时:
未发现错误:
稍微修改了test1,将n+m改为n-m后,运行效果:
可以看到,运行了之后发现错误,对拍终止,并显示WA数据的输入输出(第一行为输入,后两行分别为test1和test2的输出)
效果还算不错,这篇指导推荐人群:了解对拍原理但懒得写代码的人。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话