ZZULIOJ_1199: 在线判题(字符串)

本文介绍了一个在线判题系统的实现,重点在于如何处理用户提交的代码,通过字符串比较判断解题程序的正确性,区分Accepted、PresentationError和WrongAnswer。通过getchar读取输入并跳过空白字符进行严格比较。
摘要由CSDN通过智能技术生成

题目描述

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

输入

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

输出

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

样例输入

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

样例输出

Presentation Error
Accepted
Wrong Answer
Presentation Error

Solution

首先,要明确问题的输入、输出,与可计算部分
显然,题目的要求是读入两个字符串,对两个字符串进行判等后,输出判断结果。
所以,我们只需要解决2个问题:1.如何读入字符串 2.如何比较字符串

Q1:如何读入

因为涉及到读入空格、制表符、换行,所以无法使用 scanf 和 gets()。
因此,我选用了getchar来读入。
但是,我们还要处理“开始标志”的问题(START)。
我是在读入的过程中动态判断,代码实现如下

char flagg[10] = {'S','T','A','R','T'};
void Begin() {
    j = 0;
    while (1) {
        c = getchar();
        if (c == flagg[j]) {
            if (j == 4) break;
            ++j;
        }
        else j = 0;
    }
}

同理,也可以实现“结束标志”的判断。(举一反三 自己思考 如何实现)

Q2:如何比较

有三种判断结果:严格相等1不等2不严格相等3
我在这里只讨论不严格相等的判定方法。
不严格相等的判断的实质跳过空白字符的判断。
那么,不等的实质是什么呢?是非严格相等?还是非不严格相等呢?

Code

#include <stdio.h>
char a[10000], b[100000], c, flagg[10] = {'S','T','A','R','T'}, flag[10]={'E', 'N', 'D'};
int i, N, lb, la, j, f, k;
void Begin() {
    j = 0;
    while (1) {
        c = getchar();
        if (c == flagg[j]) {
            if (j == 4) break;
            ++j;
        }
        else j = 0;
    }
}
void Input(char *str, int *p)
{
    Begin();
    i = 0, j = 0, f = 0;
    while (1) {
        c = getchar();
        *(str + i) = c;
        if (c == flag[j]) {
            if (j == 2) break;
            ++j;
        }
        else j = 0;
        ++i;
    }
    *p = i-3;
}
void Judge() {
    i = 0, j = 0, k = 0;
    if (la == lb) {
        while (k <= la)
            if (a[k] == b[k]) ++k;
            else break;
        if (k == la+1) {
            printf("Accepted\n");
            return;
        }
    }
    while (i <= la || j <= lb)
    {
        while (a[i] == ' ' || a[i] == '\t' || a[i] == '\n') ++i;
        while (b[j] == ' ' || b[j] == '\t' || b[j] == '\n') ++j;
        if (a[i] != b[j]) {
            printf("Wrong Answer\n");
            return;
        }
        else ++i, ++j;
    }
    printf("Presentation Error\n");
}
int main()
{
    scanf("%d", &N);
    while (N--)
    {
        Input(a, &la);
        Input(b, &lb);
        Judge();
    }
}

  1. 严格相等:对应题中Accepted,特别提示空白符号也要完全相等。 ↩︎

  2. 不等:Wrong Answer ↩︎

  3. 不严格相等:Presentation Error ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值