1. 程式人生 > >PAT-B-1003

PAT-B-1003

三種 car con tin style oid 哪些 htm -html

1003 我要通過!(20 分)

“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。

得到“答案正確”的條件是:

  1. 字符串中必須僅有 PAT這三種字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以獲得“答案正確”,其中 x 或者是空字符串,或者是僅由字母 A 組成的字符串;
  3. 如果 aPbTc 是正確的,那麽 aPbATca 也是正確的,其中 abc 均或者是空字符串,或者是僅由字母 A 組成的字符串。

現在就請你為 PAT 寫一個自動裁判程序,判定哪些字符串是可以獲得“答案正確”的。

輸入格式:

每個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (<10),是需要檢測的字符串個數。接下來每個字符串占一行,字符串長度不超過 100,且不包含空格。

輸出格式:

每個字符串的檢測結果占一行,如果該字符串可以獲得“答案正確”,則輸出 YES,否則輸出 NO

輸入樣例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

輸出樣例:

YES YES YES YES NO NO NO NO
思考:

分析題意分析,P之前A的個數PA,P與T中間A的個數PAT,T之後的A的個數TA,存在:TA = PAT*PA。有了這個結論之後問題就轉變為如何求這三個值了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int judge(int a, int b, int c){
 5     return c == b*a;//根據兩個遞歸條件得到:P之前的A個數、PT中間的A個數、T之後的A個數之間的關系 
 6 }
 7 
 8 int main(void)
 9 {
10   int i, j, n, flag;
11   int a, b, c;
12   char str[101];
13   scanf("%d", &n);
14   for( j=0; j<n; j++){
15 flag=1; 16 scanf(" %s", &str); 17 int len = strlen(str); 18 if( len < 3 ){//長度驗證 19 printf("NO"); 20 if( j < n-1 ) printf("\n"); 21 continue; 22 } 23 else{ 24 //找到P前只能有A或空 25 for( i=0; i<len; i++ ){ 26 if( str[i] == P ) 27 break; 28 if( str[i] != A ){ 29 printf("NO"); 30 if( j < n-1 ) printf("\n"); 31 flag = 0; 32 break; 33 } 34 } 35 if( flag == 0 ) continue; 36 a = i - 0;//P之前A的個數 37 38 if( len - i == 3 ){//僅剩3字符 39 if( str[i] == P && str[i+1] == A && str[i+2] == T ){ 40 printf("YES"); 41 if( j < n-1 ) printf("\n"); 42 flag = 1; 43 } 44 else{ 45 printf("NO"); 46 if( j < n-1 ) printf("\n"); 47 flag = 0; 48 } 49 continue; 50 } 51 else if( len - i < 3){ 52 printf("NO"); 53 if( j < n-1 ) printf("\n"); 54 flag = 0; 55 continue; 56 } 57 else{ 58 int count=0; 59 for( i=i+1; i<len; i++ ){ 60 if( str[i] == T ) 61 break; 62 else if( str[i] != A ){//P與A之間有其他字符 63 printf("NO"); 64 if( j < n-1 ) printf("\n"); 65 flag = 0; 66 } 67 } 68 if( flag == 0 ) continue; 69 b = i - a - 1;//P、T之間的A的個數 70 c = len - i - 1;//T之後A的個數 71 72 //檢查T之後還有沒有除A以外的字符 73 for( i=i+1; i<len; i++){ 74 if( str[i] != A ){ 75 printf("NO"); 76 if( j < n-1 ) printf("\n"); 77 flag=0; 78 break; 79 } 80 } 81 } 82 } 83 if( flag == 1 ) { 84 flag = judge(a, b, c); 85 if( flag ) printf("YES"); 86 else printf("NO"); 87 } 88 89 if( j < n-1 ) printf("\n"); 90 } 91 92 return 0; 93 }

PAT-B-1003