【PAT】1003. 我要通过!(20)

1003. 我要通过!(20)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 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

题目中A为一个特殊的字符,因为只有A的个数是可变的。
观察题目中第三个条件:“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”(a、b、c为只包含A的字符串或空串),
可以发现,P和T之间增加一个A,而T后面增加了a,存在一种线性增加关系:a*1=a,即:
  P之前A的个数 × P、T之间A的个数 = T后面A的个数
条件二即是上面公式的一种情况。
根据题目给出的三个条件,可以得出能获得“正确答案”的字符串应满足的条件是:
  1.只包含P、A、T三种字符
  2.P、T个数分别只有一个,且P在T前面
  3.满足公式:P之前A的个数 × P、T之间A的个数 = T后面A的个数
例如:APT输出“YES”,ATP输出“NO”

C 代码如下:
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int main(){
 6     int n,i,j;
 7     int len;  //存储每个字符串的长度 
 8     int num_p,num_t,num_a;  //存储P、T、A的个数 
 9     int pos_p,pos_t;  //存储P、T的位置 
10     char str_input[10][100];
11     scanf("%d\n",&n);
12     for(i=0;i<n;i++){
13         scanf("%s\n",&str_input[i]);        
14     }
15     for(i=0;i<n;i++){
16         len=strlen(str_input[i]);
17         num_p=num_t=num_a=pos_p=pos_t=0;
18         for(j=0;j<len;j++){
19             if(str_input[i][j]=='P'){
20                 num_p++;
21                 pos_p=j;
22                 if(num_p>1) break;  //'P'个数大于1,跳出循环输出NO 
23             }
24             else if(str_input[i][j]=='T'){
25                 num_t++;
26                 pos_t=j;
27                 if(num_t>1) break; //'T'个数大于1,跳出循环输出NO
28             }
29             else if(str_input[i][j]=='A'){
30                 num_a++;
31             }
32             else break;  //包含其他字符,退出循环,输出NO 
33         }
34         if((pos_p*(pos_t-pos_p-1)==len-pos_t-1) && num_p==1 && num_t==1 && num_a>0)
35             printf("YES\n");
36         else printf("NO\n");        
37     }
38     system("pause");    
39     return 0;
40 }

猜你喜欢

转载自www.cnblogs.com/pgzhang/p/8920601.html