题目描述
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();
}
}