从零开始写OJ---Special Judge

来源:互联网 发布:java大牛简历 编辑:程序博客网 时间:2024/05/16 15:42

OJ平台可以接受用户提交的代码并运行,根据对比运行结果来判断正确与否的。但是很多时候,一个问题并没有一个确切的解,比如说数独,给你一个9*9的方格,要求你用数字1-9来填充,横竖斜都不能有相同,很明显解法并非只有一种。

那如果有这样的题目,要怎样在OJ上进行评测呢?这就要用到Special Judge了。顾名思义,SPJ的题目会被特别的判定,只要用户提交代码的输出满足一定的要求,就会被判定为正确。

SPJ的使用范围是非常广泛的,毕竟这个世界上大部分的问题,还是有很多答案的,即使是在OJ上也是一样。很多OJ是支持special judge的,我们要写的这个评测姬也不例外的要支持。

为了能够写出一个special judge的评测姬,我们需要先明确SPJ的原理和流程。

spj流程
对于每个需要spj的题目,我们都要提供一个spj程序,这个程序应该读取标准输入数据、标准输出数据、用户输出数据,然后根据这三个数据来进行对结果的判断,spj程序的输出将会作为此次评测的提示返回给用户。根据这个流程,我敲了一个我的special judge所需的特判程序模板。

#include <iostream>#include <fstream>#define TRUE 0#define FALSE 1#define ERR 2using namespace std;int main(int argc, char * argv[]){    if (argc < 4) {        cout << "args error" << endl;        return ERR;    }    ifstream std_in(argv[1]);    ifstream std_out(argv[2]);    ifstream user_out(argv[3]);    /* special judge start */    int n;    user_out >> n;    if (n < 128) {        cout << "太小了" << endl;        return FALSE;    }    else if (n > 256) {        cout << "太大了" << endl;        return FALSE;    }    /* special judge end */    return TRUE;}

spj程序从args中获得要打开的文件路径,自行打开文件进行评测,这个评测程序是用来判断用户的输出是否在(128, 256)之间的,如果用户输出错误,评测系统就会输出相应的提示。spj程序由评测姬程序fork执行,通过管道获取spj的输出,通过返回值来判断是否正确。
这里是我的评测姬的github地址,虽然现在只有个demo,还没能完全整合起来……

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 损友圈羊被陌生人偷了怎么办 在酒店如果遇到客人偷东西怎么办 梦见家里有不好的东西怎么办 被小孩要破了怎么办啊 租一个房子小孩一进房就哭怎么办 墙缝里有蝙蝠窝怎么办 小蝙蝠在墙缝里怎么办 小孩一进屋就哭怎么办 屋门对着厕所门怎么办 入室门对厨房门怎么办 厕所正对入户门怎么办 小区楼交错冲路怎么办 床的位置在五鬼上怎么办 被甩了很痛苦怎么办 和对象想分手了怎么办 对象想跟你啪啪怎么办 相亲对象好像不太想理我怎么办 想跟对象分手了怎么办 异地恋分手后该怎么办 面膜敷了一晚上怎么办 梦见被刺猬咬了怎么办 梦见死人叫我名字答应怎么办 香瓜苗叶子长斑怎么办 奶油打出来很稀怎么办 寄的水果压坏了怎么办 吃了一个烂水果怎么办 孕期吃了烂水果怎么办 邮快递水果坏了怎么办 快递寄水果坏了怎么办 闲鱼买家拒收水果怎么办 洗澡桶里有很多老鼠屎怎么办? 塑料和金属断了怎么办 孕妇吃了沙拉酱怎么办 孕妇淀粉吃多了怎么办 怀孕初期吃了杏怎么办 如果睡觉吃梨了怎么办 怀孕6个月有点贫血怎么办 怀孕八个多月有点贫血怎么办 生完小孩身体虚怎么办 孩子咳嗽厉害怎么办吃什么药 新生儿三天不拉大便怎么办