【ACM】杭电1073:Online Judge

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


你可能感兴趣的:(【ACM】杭电1073:Online Judge)