PAT-B-1003
阿新 • • 發佈:2018-09-02
三種 car con tin style oid 哪些 htm -html
1003 我要通過!(20 分)
“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
- 字符串中必須僅有
P
、A
、T
這三種字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以獲得“答案正確”,其中x
或者是空字符串,或者是僅由字母A
組成的字符串; - 如果
aPbTc
是正確的,那麽aPbATca
也是正確的,其中a
、b
、c
均或者是空字符串,或者是僅由字母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