1164: 在线判题(字符串)

本文介绍了一种在线判题系统的实现方法,重点在于如何对比用户的解题程序输出与标准答案之间的差异,包括精确匹配、忽略空白符差异及错误情况的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

LittleTom开发了一个在线判题系统,判题系统需要把用户提交上来的代码编译成可执行文件,然后运行。而用户会提交什么样的代码是无法预知的,所以LittleTom做了充分的准备,比如阻止解题程序访问文件系统、阻止解题程序访问注册表、阻止解题程序修改系统设置、阻止解题程序关闭系统、阻止解题程序超限或非法使用内存、阻止解题程序的运行时间超过设定时间等。这些工作LitteTom都已完成。
   还有一个待解决的问题是判断解题程序的正确性。判题系统需要把解题程序产生的输出文件和正确的输出文件进行比较,如果两个文件完全相同,则判题系统返回“Accepted”,否则,如果两个文件除了空白符(空格' ', 制表符'\t', 或 回车符'\n')之外其余内容都相同,则判题系统返回“Presentation Error”,否则判题系统返回“Wrong Answer”。
给定两个文件,一个代表正确输出,一个代表用户的解题程序的输出,你的任务是计算判题系统应该返回什么信息。

Input

输入包含多组测试实例。第一行输入一个整数T表示测试实例的个数。然后是T组输入。每组输入有两部分:一个代表正确输出,一个代表用户的解题程序的输出。都以“START”开始,以“END”结束,在“START”和“END”之间的是需要判断的数据部分。

Output

对于每一个测试实例,有一行输出,输出判题系统应该返回的结果:Accepted、Presentation Error或Wrong Answer。

Sample Input

4START1 + 2 = 3ENDSTART1+2=3ENDSTART1 + 2 = 3ENDSTART1 + 2 = 3ENDSTART1 + 2 = 3ENDSTART1 + 2 = 4ENDSTART1 + 2 = 3ENDSTART1 + 2 = 3END

Sample Output

Presentation ErrorAcceptedWrong AnswerPresentation Error

HINT  \


//'\t'制表符
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1005
int   Compare(char *a,char *b);
void  Input(char *str);
void  Del(char *str);

int  main   ()
{
      int  T;
	  int  m = 0; 
	  char   *a,*b;
	  scanf("%d",&T);
	  while ( T-- )
	  {
	        a = (char *)malloc(N*sizeof(char)); 
            b = (char *)malloc(N*sizeof(char)); 
	//将a中后的N个字节用0替换并返回a,清0操作
			memset(a,0,N*sizeof(char));
			memset(b,0,N*sizeof(char));
			
			Input(a);
			Input(b);
			m = Compare(a,b);
			if ( m == 1 )
				printf("Accepted\n");
			else if ( m == 2 )
				printf("Presentation Error\n");
			else
				printf("Wrong Answer\n");
//该函数是将malloc分配的内存空间释放
			free(a);
			free(b); 
	  }
return 0;
}

/*int strcmp(char *str1,char *str2);
比较两个字符串str1,str2,若str1<str2,返回负数,相等返回0,大于返回正数
*/
int    Compare(char *a,char *b)
{
       if ( strcmp(a,b)==0 )
		   return 1;
        Del(a);
		Del(b);
       if ( strcmp(a,b)==0 ) 
		   return 2;
	   return 3;
}

void  Input(char *str)
{
      char   *str1;
	  str1 = (char  *) malloc (N*sizeof(char));
	  memset(str1,0,N);
	  while ( gets(str1) ,strcmp(str1,"START") );
	  while ( gets(str1) ,strcmp(str1,"END") )
	  {
/* char *strcat(char *str1,char *str2);把字符串str2接到str1后面
str1最后面的'\0'被取消。 */
	       if ( *str1 == 0 )
                 strcat(str,"\n");
		   else
			     strcat(str,str1);
	  }
}
void Del(char *str)
{
      char  *s;
	  s = (char *)malloc( N*sizeof( char ) );
	  memset(s,0,N);
	  int i=0,j=0;
	  for ( i=0 ; *(str+i)!='\0' ; i++ )
	  {
	       if ( *(str+i)!=' ' && *(str+i)!='\t' && *(str+i)!='\n' )
		   {
		       *( s + j )=*( str + i );
			   j++;
		   }
	  }
      *( s + j ) = '\n' ;
//int strcpy(char *str1,char *str2);把str2指向的字符复制到str1中去,返回str1
	  strcpy(str,s);
}

#include<stdio.h>
#include<string.h>
#define N 200001
void  Del(char  ch[]);
int   Compare(char a[],char b[]);
void  Input(char  ch[]);
int   main   ()
{
       int T;
	   char  a[N],b[N];
	   int   m;
	   scanf("%d",&T);
	   while ( T-- )
	   {
	        memset(a,0,sizeof(a));
			memset(b,0,sizeof(b));
			Input(a);
			Input(b);
			m = Compare(a,b);
			if ( m == 1 )
				printf("Accepted\n");
            else  if ( m == 2 )
                printf("Presentation Error\n");
			else
				printf("Wrong Answer\n");
	   }

return 0;
}

int   Compare(char a[],char b[])
{
      if( strcmp(a,b) == 0 )
            return 1;
	  Del(a);
	  Del(b);
	  if( strcmp(a,b) == 0 )
		  return 2;
	  return 3;
}   

void  Del(char  ch[])
{
      int i,j;
	  j=0;
	  char   s[N]={0};
	  for ( i=0 ; ch[i]!='\0' ; i++ )
	  {
	        if ( ch[i] !=' ' && ch[i] != '\n' && ch[i] != '\t' )
				s[j++]=ch[i];
	  }
	  s[j+1]='\n';
	  strcpy(ch,s);

}
void   Input(char ch[])
{
	char  str[N]={0};
	while(gets(str),strcmp(str,"START"));
	while(gets(str),strcmp(str,"END"))
	{
	        if ( str[0]==0 )
				strcat(ch,"\n");
			else
				strcat(ch,str);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值