LittleTom开发了一个在线判题系统,判题系统需要把用户提交上来的代码编译成可执行文件,然后运行。而用户会提交什么样的代码是无法预知的,所以LittleTom做了充分的准备,比如阻止解题程序访问文件系统、阻止解题程序访问注册表、阻止解题程序修改系统设置、阻止解题程序关闭系统、阻止解题程序超限或非法使用内存、阻止解题程序的运行时间超过设定时间等。这些工作LitteTom都已完成。 还有一个待解决的问题是判断解题程序的正确性。判题系统需要把解题程序产生的输出文件和正确的输出文件进行比较,如果两个文件完全相同,则判题系统返回“Accepted”,否则,如果两个文件除了空白符(空格' ', 制表符' ', 或 回车符' ')之外其余内容都相同,则判题系统返回“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
#include
#include
#include
#define N 10000
int F(char ch)// 判断是否为 空格 换行符 水平制表符
{
if(ch == ' ' || ch == '
' || ch == ' ')
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, "
");// 如果不判断为空的情况加上一个换行符的话,有可能会把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
");
else if(num == 2)
printf("Presentation Error
");
else
printf("Wrong Answer
");
}
return 0;
}
留言与评论(共有 0 条评论) “” |