这个题出得很有意义。。自己写一个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; }