1. 程式人生 > >解題報告:hdu 1073 Online Judge

解題報告:hdu 1073 Online Judge

字符串 turn 保留 inpu 時也 空字符串 cep span one

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1073

題目是英文,在這裏用中文顯示:

伊格內修斯正在建立一個在線法官,現在他已經研究出除法官系統以外的所有問題。系統必須從正確的輸出文件和用戶的結果文件讀取數據,然後系統比較這兩個文件。如果兩個文件絕對相同,則判定系統返回“Accepted”,否則如果兩個文件之間的唯一區別是空格(‘ ‘),制表符(‘\t‘)或輸入(‘\n‘),法官系統應返回“Presentation Error”,否則系統將返回“Wrong Answer”。

給定正確輸出文件的數據和用戶結果文件的數據,您的任務是確定判定系統將返回哪個結果。

輸入

輸入包含多個測試用例。輸入的第一行是單個整數T,它是測試用例的數量。 T測試用例如下。 每個測試用例都有兩個部分,正確輸出文件的數據和用戶結果文件的數據。它們都是以單行開始,包含一個字符串“START”,並以單行結尾包含一個字符串“END”,這兩個字符串不是數據。換句話說,數據在兩個字符串之間。數據最多為5000個字符。

輸出

對於每個測試用例,您應輸出Judge System應返回的結果。

解題思路:

做這道題時,因為我們只知道數據是在START與END之間給出的,而且從輸入輸出實例來看,我們需要循環讀入START與END之間的每行字符串,保存在一個字符數組中,再循環讀入非空格,制表符,換行符的字符到另一個字符數組中,這樣來比較,思路就很清楚了,註解在代碼中。。。

AC代碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=5005;
 4 char tmp[N];//用來讀取暫時的字符串
 5 char a1[N],a2[N],b1[N],b2[N];
 6 void input(char *a,char *b)
 7 {
 8     gets(tmp);//首先讀入START
 9     while(strcmp(tmp,"START")!=0)gets(tmp);//當輸入的不是START(有可能是空行)時,繼續輸入,否則就不執行此句
10     while(gets(tmp)){//
接下來循環讀入START與END之間的每行字符串 11 if(strcmp(tmp,"END")==0)break;//結束條件,跳出 12 if(strlen(tmp)!=0)strcat(a,tmp);//當輸入的不是空字符串的時候(忽略單行的空字符串),即可鏈接保存在a數組後面 13 strcat(a,"\n");//多加一個換行符,下次鏈接的時候就可直接把‘\n‘覆蓋掉,保留實際的行讀入操作,同時也作為標記 14 } 15 int k=0,n=strlen(a); 16 for(int i=0;i<n;++i)//循環賦值給b數組 17 if(a[i]!= && a[i]!=\t && a[i]!=\n)b[k++]=a[i];//當a是空格,制表符,結束符則不保存在b數組裏面 18 b[k]=\0;//要求匹配對應的格式 19 } 20 int main() 21 { 22 int t; 23 cin>>t; 24 while(t--){ 25 a1[0]=a2[0]=b1[0]=b2[0]=\0;//記得數組初始化 26 input(a1,b1);//兩部分輸入 27 input(a2,b2); 28 if(strcmp(a1,a2)==0)cout<<"Accepted"<<endl;//當a1==a2時表明文本輸入相同 29 else if(strcmp(b1,b2)==0)cout<<"Presentation Error"<<endl;//否則修改後表明格式不匹配 30 else cout<<"Wrong Answer"<<endl;//否則就是錯誤答案 31 } 32 return 0; 33 }

解題報告:hdu 1073 Online Judge