关于交互

· · 个人记录

目的

官方介绍有点不清楚。

内容

分类

交互分两种:IO、grader

IO

介绍

这类交互题要求选手的程序与交互器使用标准输入输出进行交互。

写法

首先在选择算法标签时要选上\colorbox{orange}{\color{white}{\small\text{Special Judge}}}\colorbox{orange}{\color{white}{\small\text{交互题}}},同时要写上温馨提示:“在输出后请使用 cout << endl;fflush(stdout); 等刷新缓冲区,避免 \text{TLE}”。

然后在你的 data.zip 包里新建两个文件:checker.cppinteractive_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;
}

交互过程

  1. checker.cpp 读入输入数据中的 a,b 并向用户程序输出;
  2. 用户程序 读入 a,b 并输出答案;
  3. 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.cppinteractive_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;
}

交互过程

  1. interactive_lib.cpp 读取输入数据并调用用户定义的函数;
  2. 用户的函数 返回答案;
  3. interactive_lib.cpp 将用户返回的答案发送给SPJ;
  4. checker.cpp 判题并返回。

That's all!!!