关于交互
目的
官方介绍有点不清楚。
内容
分类
交互分两种:IO、grader
IO
介绍
这类交互题要求选手的程序与交互器使用标准输入输出进行交互。
写法
首先在选择算法标签时要选上cout << endl; 或 fflush(stdout); 等刷新缓冲区,避免
然后在你的 data.zip 包里新建两个文件:checker.cpp、interactive_lib.cpp,将 interactive_lib.cpp 留空。
你的数据点请视情况而定(大多数情况下输入数据是提供给交互器输出的数据,而输出数据可能为空)。
下面就要开始写 checker.cpp。先给出一个例子(A+B Problem,当然,这样的交互没太大用):
#include "testlib.h"//必须有
#include <iostream>
using namespace std;
int main(int argc, char* argv[]/*注意这里的参数*/)
{
setName("Interactor A+B");//这一行没太大用,建议把A+B换成题目的名字
registerInteraction(argc, argv);//必须存在
int a = inf.readInt(), b = inf.readInt();//和SPJ一样
cout << a << ' ' << b << endl;//交互器和选手程序可以直接通过stdio交互,
int x;
cin >> x;//同上
if ((a + b) == x)
{
quitf(_ok, "Correct Answer.");//与SPJ相同的返回方式
}
else
{
quitf(_wa, "Wrong Answer, expected %d, output %d", a + b, x);
}
return 0;
}
//用户程序
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << (a + b) << endl;
return 0;
}
交互过程
checker.cpp读入输入数据中的a,b 并向用户程序输出;用户程序读入a,b 并输出答案;checker.cpp读入用户答案并返回。grader
介绍
这类交互题要求选手的程序与交互器使用函数调用进行交互。
写法
首先在选择算法标签时要选上
\colorbox{orange}{\color{white}{\small\text{Special Judge}}} (官方说可有可无,但建议有)、\colorbox{orange}{\color{white}{\small\text{交互题}}} ,同时要写上温馨提示:“不需要main函数,请定义xxx函数(用户的答案),声明yyy函数(交互库提供的),并在前面加上extern "C"”。
然后在你的 data.zip 包里新建两个文件:checker.cpp、interactive_lib.cpp。
你的数据点请视情况而定(大多数情况下输入数据是提供给交互器输出的数据,而输出数据可能为空)。
下面就要开始写 interactive_lib.cpp&checker.cpp。先给出一个例子(A+B Problem,当然,这样的交互没太大用):
//checker.cpp
#include "testlib.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
setName("Interactor A+B");
registerInteraction(argc, argv);
int a = inf.readInt(), b = inf.readInt();
cout << a << " " << b << endl;//发送给交互库
int pa = ouf.readInt();//这里的ouf是交互库的输出
int ja = a + b;
if (ja != pa) quitf(_wa, "expected %d, found %d", ja, pa);
else quitf(_ok, "answer is %d", ja);
}
//interactive_lib.cpp
#include <bits/stdc++.h>
using namespace std;
extern "C" {//注意了,为了方便C党,请加上
extern int plus(int a, int b);
}
int main()
{
int a, b;
cin >> a >> b;//从输入数据读取
cout << plus(a, b)/*调用用户的函数,让SPJ判定*/ << endl;
return 0;
}
//用户程序
extern "C" int plus(int a, int b)
{
return a + b;
}
交互过程
interactive_lib.cpp读取输入数据并调用用户定义的函数;用户的函数返回答案;interactive_lib.cpp将用户返回的答案发送给SPJ;checker.cpp判题并返回。