在线判题(字符串)

来源:互联网 发布:淘宝网店上货教程 编辑:程序博客网 时间:2024/04/30 05:07

Description

LittleTom开发了一个在线判题系统,判题系统需要把用户提交上来的代码编译成可执行文件,然后运行。而用户会提交什么样的代码是无法预知的,所以LittleTom做了充分的准备,比如阻止解题程序访问文件系统、阻止解题程序访问注册表、阻止解题程序修改系统设置、阻止解题程序关闭系统、阻止解题程序超限或非法使用内存、阻止解题程序的运行时间超过设定时间等。这些工作LitteTom都已完成。
还有一个待解决的问题是判断解题程序的正确性。判题系统需要把解题程序产生的输出文件和正确的输出文件进行比较,如果两个文件完全相同,则判题系统返回“Accepted”,否则,如果两个文件除了空白符(空格’ ‘, 制表符’\t’, 或 回车符’\n’)之外其余内容都相同,则判题系统返回“Presentation Error”,否则判题系统返回“Wrong Answer”。
给定两个文件,一个代表正确输出,一个代表用户的解题程序的输出,你的任务是计算判题系统应该返回什么信息。

Input

输入包含多组测试实例。第一行输入一个整数T表示测试实例的个数。然后是T组输入。每组输入有两部分:一个代表正确输出,一个代表用户的解题程序的输出。都以“START”开始,以“END”结束,在“START”和“END”之间的是需要判断的数据部分。

Output

对于每一个测试实例,有一行输出,输出判题系统应该返回的结果:Accepted、Presentation Error或Wrong Answer。

Sample Input

4
START
1 + 2 = 3
END
START
1+2=3
END
START
1 + 2 = 3
END
START
1 + 2 = 3
END

START
1 + 2 = 3
END
START
1 + 2 = 4
END
START
1 + 2 = 3
END
START
1 + 2 = 3
END
Sample Output

Presentation Error
Accepted
Wrong Answer
Presentation Error

其实这个提的思路很简单 : 先把正确答案和提交的答案分别用字符串存起来,然后先判断这两个字符串是否完全相等,如果不完全相等的话,在对这两个字符串进行去空白字符处理(包括 : 空格,换行符,水平制表符),然后再判断经过处理之后的两个新的字符串是否相等,最后根据上面的几次判断的结果输出对应的结果。

大家看过上面的解题思路之后会觉得这道题挺简单的,但是在第一步存字符串的过程中可能会出现意想不到的bug,这里有两种存储的方法:第一种 是用二维字符串数组,第二种是 用 字符串连接函数存储到一个字符串当中; 显然第二种回事比较简单的,但是这里有一个小细节一定要处理好,这个细节就是 : 在存储字符串的时候,如果有一行只输入了一个 回车,那么被存储的那个字符串是 无法存储这个 换行符的,无论是 scanf 还是 gets 都不可以,(当然也许有的朋友用的输入语句比较厉害),那么这种情况 你要单独 把这个 换行符 连接到 整个字符串的后面,否则会发生 本来应该是 Presentation Error 的 就变成 Accepted 了 有的 oj 就会 给你 提示 该 错误情况!

代码如下 ,大家可以参考一下,哪里有错误了或者有所不足 希望大家多多指教!

/**************************************************************    Problem: 1164(ACM.zzuli.edu.cn)    User: LSC    Language: C++    Result: Accepted    Time:0 ms    Memory:892 kb****************************************************************/#include <stdio.h>#include <string.h>#include <stdlib.h>#define N 10000int F(char ch)// 判断是否为 空格 换行符 水平制表符{    if(ch == ' ' || ch == '\n' || ch == '\t')        return 1;    else        return 0;}int injuge(char * ans, char * test)// 判断 函数, 1 : Accepted  2 : Presentation Error  3 : Wrong Answer{    if(strcmp(ans, test) == 0) return 1;    char s1[N] = {0}, s2[N] = {0};    int i, k;    for(i = 0, k = 0; ans[i] != '\0'; i++)        if(!F(ans[i]))            s1[k++] = ans[i];    for(i = 0, k = 0; test[i] != '\0'; i++)        if(!F(test[i]))            s2[k++] = test[i];    if(strcmp(s1, s2) == 0)        return 2;    else        return 3;}void input(char * str)// 输入函数{    while(1)    {        char temp[N] = {0};        gets(temp);        if(strcmp(temp, "START") == 0) continue;        if(strcmp(temp, "END") == 0) break;        if(temp[0] == 0)            strcat(str, "\n");// 如果不判断为空的情况加上一个换行符的话,有可能会把presentation  变成 Accept(错误点)        else            strcat(str, temp);    }}int main(){    int t;    scanf("%d", &t);    getchar();    while(t--)    {        char ans[N];//  correct answer        char test[N];// input  answer        memset(ans, 0, sizeof(ans));// 对字符串数组进行初始化(新学的)        memset(test, 0, sizeof(test));        input(ans);        input(test);        int num = injuge(ans, test);        if(num == 1)            printf("Accepted\n");        else if(num == 2)            printf("Presentation Error\n");        else            printf("Wrong Answer\n");    }    return 0;}