PAT 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
  1 #include<stdio.h>
  2 #include<string.h>
  3 int main(){
  4     /*
  5      后前面A的数目/P前面A的数目等于P与A中间的A的数目。 
  6      办法有点笨 
  7     */
  8     int n;
  9     scanf("%d",&n);
 10     char c[100];
 11     int i;
 12     int b;//数组长度 
 13     float a1=0;//P前面A的数目 
 14     float a2=0;//P后面,T中间,A的数目 
 15     float a3=0;//T后面A的数目 
 16     int k1=0;//P的数目 
 17     int k2=0;//T的数目 
 18     int p;//P的位置 
 19     int t;//T的位置 
 20     int y;//跳出第二层循环 
 21     while(n--)
 22     {
 23         y = 0;
 24         k1 = 0;
 25         k2 = 0;
 26         a1 = 0;
 27         a2 = 0;
 28         a3 = 0;
 29         scanf("%s",c);
 30         b = strlen(c);
 31         /*
 32             判断是不是有多个P或T以及P与T的位置 
 33         */
 34         for(i=0;i<b;i++)
 35         {
 36             if(c[i]=='P')
 37             {
 38                 p = i;
 39                 k1++;
 40             }
 41             if(c[i]=='T')
 42             {
 43                 t = i;
 44                 k2++;
 45             }
 46         }
 47         if(k1!=1||k2!=1)
 48         {
 49             printf("NO
");
 50             continue;
 51         }
 52         /*
 53             计算P之前A的数目,同时若不是A字符输出NO 
 54         */ 
 55         for(i=0;i<p;i++)
 56         {
 57             if(c[i]=='A')
 58             {
 59                 a1++;
 60             }
 61             else
 62             {
 63                 printf("NO
");
 64                 y=1;
 65                 break;
 66             }
 67             
 68         }
 69         if(y)
 70         {
 71             continue;
 72         }
 73         /*
 74         判断P与T之间的A的数目,若不是A字符输出NO  
 75         */ 
 76         for(i=p+1;i<t;i++)
 77         {
 78             if(c[i]=='A')
 79             {
 80                 a2++;
 81             }
 82             else{
 83                 printf("NO
");
 84                 y=1;
 85                 break;
 86             }
 87         }
 88         if(y)
 89         {
 90             continue;
 91         }
 92         /*
 93             计算T之后A的数目,不是字符A输出NO 
 94         */ 
 95         for(i=t+1;i<b;i++)
 96         {
 97             if(c[i]=='A')
 98             {
 99                 a3++;
100             }
101             else{
102                 printf("NO
");
103                 break;
104             }
105         }
106         /*
107         判断条件 
108         */ 
109         if(a1!=0)
110         {
111             if(a3/a1!=a2)
112             {
113                 printf("NO
");
114                 continue;
115             }
116         
117         }
118         /*
119         若a1是0则a3也一定是0 
120         */ 
121         else
122         {
123             if(a3!=0)
124             {
125                 printf("NO
");
126                 continue;
127             }
128         }
129         if(a2==0)
130         {
131             printf("NO
");
132             continue;
133         }
134         /*
135         其他条件都成立 
136         */ 
137         printf("YES
"); 
138     }
139 } 
原文地址:https://www.cnblogs.com/lolybj/p/6145019.html