刚开始看这道题确实很绕,不知道怎么做。后来按照自己的想法做了之后吗,发现无论如何都得不到满分,只能得17分。
后来一百度才发现,原来前面的A的数量乘以中间A的数量必须等于后面A的数量。
这才豁然开朗,开始重新写代码,然后经过一阵debug之后,就AC过了
现在在下面贴代码。
注:因为是第二次写的,写的时候注释比较少。加上嵌套又比较多。可能第一次看,不一定看得懂。
话又说回来,我也讨厌这样失败的我,写的代码并不优雅。而且又臭又长。
#include <stdio.h>
int main(){
/*
得到“答案正确”的条件是:
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
*/
int n;
//此道题解法关键是 pl*ml=ll
int shaixuan[10] = { 0 };
while (scanf("%d",&n)!=EOF)
{
int temp = n;
while (n--)
{
int pl = 0, ml = 0, ll = 0;//pl为前面A的数,ml为中间A的数,ll为后面A的数
int flag = 1;//进行标记
char ac[101];
scanf("%s", ac);
int i = 0;
if (ac[i] == 'P'){
pl = 0;
i++;
if (ac[i] != 'A') flag = 0;
else
{
while (ac[i] == 'A'){
ml++;
i++;
if (ac[i] != 'A'&&ac[i] != 'T'){
flag = 0;
break;
}
}
if (flag != 0){
if (ac[i] != 'T') flag = 0;
else {
i++;
while (ac[i]!='\0')
{
if (ac[i] == 'A')ll++;
else
{
flag = 0;
break;
}
}
}
}
}
}
else if (ac[i]=='A'){//以A开头,计算A开头的A的数
while (ac[i] == 'A'){
pl++;
i++;
}
if (ac[i] != 'P') flag = 0;
else
{
i++;
if (ac[i] == 'A'){
while (ac[i]=='A')
{
ml++;
i++;
}
if (ac[i] != 'T')flag = 0;
else
{
i++;
while (ac[i] != '\0')
{
if (ac[i] == 'A')ll++;
else
{
flag = 0;
break;
}
i++;
}
}
}
else flag = 0;
}
}
else{
flag = 0;
}
if (flag == 0)shaixuan[n] = 0;
else
{
if (pl*ml == ll) shaixuan[n] = 1;
else
shaixuan[n] = 0;
}
}
for (int i = temp-1; i >=0; i--){
if (shaixuan[i] == 0) printf("NO\n");
else
printf("YES\n");
}
}
return 0;
}