这个题出得很有意义。。自己写一个OJ系统,能让我们加深对ACM比赛规则的理解。
分析:
这道题需要解决的问题有2个:
1、数据输入问题。即如何才能以START串开始,END串结束。并把这两个字符串之间的内容储存起来(可能有有多行数据,可能有空格,换行)。解决的方法是,do..while循环:用gets获取每一行输入的字符串后,紧接着用getchar获取到下一次输入的前3个字符,如果这3个字符是E,N,D,则说明输入结束,退出循环,否则就把刚刚gets到的字符串用strcat函数跟上一次输入的串拼接起来。注意拼接之前要把用getchar获得的字符用ungetc函数放回到输入流中!!
2、WA,PE,AC的判断问题。解决方法是:先比较输入数据与标准答案是否完全相同,要同则AC。否则把标准答案和用户输入的数据中的 \t , \n , 和空格全部删除,再次进行比较。如果经过删除后两串相同,则结果为PE,反之为WA。
代码:
#include <stdio.h>
#include <string.h>
char input[5050];
char right[5050];
char temp[5050];
int is_end(char *temp,char *right)
{
if(!strcmp(temp,"END"))
return 1;
char e = getchar();
if(e == '\n')
return 0;
char n = getchar();
if(n == '\n')
return 0;
char d = getchar();
if(d == '\n')
return 0;
char enter = getchar();
int res;
if(e == 'E' && n == 'N' && d == 'D' && enter == '\n')
{
res = 1;
strcat(right,temp);
}
else
{
res = 0;
ungetc(enter,stdin);
ungetc(d,stdin);
ungetc(n,stdin);
ungetc(e,stdin);
}
return res;
}
int OJ(char *right,char *input)
{
if(!strcmp(right,input))
return 1; /* AC */
int is_del_r = del(right);
int is_del_i = del(input);
if(!strcmp(right,input))
{
if(is_del_i || is_del_r)
return -1; /* PE */
}
else
return 0;
}
int del(char *input)
{
int len = strlen(input);
int i,j;
int is_del = 0;
for(i = 0 ; input[i] != '\0' ; ++i)
{
if(input[i] == ' ' || input[i] == '\t' || input[i] == '\n')
{
for(j = i ; j < len - 1 ; ++j)
input[j] = input[j + 1];
input[j] = '\0';
is_del = 1;
--i;
}
}
return is_del;
}
int main(int argc, char *argv[])
{
int N,i,j,t;
scanf("%d",&N);
for(t = 1 ; t <= N ; ++t)
{
int time = 0,len;
char c;
memset(input,0,sizeof(input));
memset(right,0,sizeof(right));
/* the right data */
scanf("%s",temp); /* START string */
c = getchar();
do
{
len = strlen(temp);
if(0 == time) /* first time */
gets(temp);
else
{
temp[len] = c;
temp[len + 1] = '\0';
strcat(right,temp);
gets(temp);
}
c = '\n';
++time;
}while(is_end(temp,right) == 0);
/* the input data */
scanf("%s",temp); /* START string */
time = 0;
c = getchar();
do
{
len = strlen(temp);
if(0 == time) /* first time */
gets(temp);
else
{
temp[len] = c;
temp[len + 1] = '\0';
strcat(input,temp);
gets(temp);
}
c = '\n';
++time;
}while(is_end(temp,input) == 0);
int res = OJ(right,input);
switch(res)
{
case 0:
printf("Wrong Answer\n");
break;
case -1:
printf("Presentation Error\n");
break;
case 1:
printf("Accepted\n");
break;
}
}
return 0;
}