PAT 1003

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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

这个题目的难点在于理解题意。

第一个条件很简单,字符串不能包含除P,A,T外的其他字符(是否需要所有都包含,这里还不清楚)。

第二个条件给出了正确答案的字符串形式: xPATx,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串。这里表明字符串必须包含P,A,T三种字符,并且字符的顺序也确定了。即PAT或者A……APATA……A,并且前后两个A字符串必须一样。

第三个条件是一个递推的条件:如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。根据第二个条件,当b=A,a=c=空字符串或者A的字符串时,aPbTc = aPATa ,符合第二个条件,可以获得“答案正确”。那么,根据条件三递推,在此条件下的 aPbATca = aPAATaa也是正确的。此时的b=AA,c=aa. 继续递推可以获得更多“答案正确”的字符串。

这里可以看到,P后面A的个数和T后面a的个数是相同的。所以有如下的规律:c中a的个数=b中A的个数, 即length(c)=length(a)*length(b)。

找到了这个规律,编程的思路就清晰了。

这里还有一个要注意的地方是:在满足了a,b,c之间的关系的同时,不能忘记对P,T个数和顺序的判断。如果字符串中不包含P或T,或者它们的个数大于1,或者它们的顺序不对,这些都是无法输出“答案正确”的。因为样例并没有涵盖所有的情况,所以有可能样例测试成功,但是代码没有通过。这时候就需要多设计一些样例进行更加全面的测试。

源代码----------------------------------------------------------------------------------------------
#include "stdio.h"
#include "string.h"
#include "math.h"

int main()
{
int n;
int i,j;
char str[9][101];
char ch[101];
int flag;
int a, b, c;

scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s",ch);
strcpy(str[i], ch);
}


for (i = 0; i < n; i++)
{
flag = 0; //错误标志
a = 0; b = 0; c = 0; //a,b,c中A的个数
strcpy(ch, str[i]);
j = 0;


while ((ch[j] != 'P')&&(ch[j]!='\0')) //计数P前面A的个数,作为a的长度。
{
if (ch[j] == 'A')
{
a++;
j++;
}
else
{
flag = 1; //如果P前面包含不等于A的字符,答案错误。
break;
}
}
if (ch[j] != 'P') //如果字符串中不含P,答案错误。
flag = 1;


if (flag == 1)
{
printf("NO\n");
continue;
}


j = j + 1;
while ((ch[j] != 'T') && (ch[j] != '\0')) //计数P和T之间A的个数,作为b的长度。
{
if (ch[j] == 'A')
{
b++;
j++;
}
else
{
flag = 1;
break;
}
}
if ((ch[j] != 'T') || (b == 0)) //如果字符串中不含T,或者P与T之间不含A,答案错误。
flag = 1;


if (flag == 1)
{
printf("NO\n");
continue;
}


j = j + 1;
while (ch[j] != '\0')
{
if (ch[j] == 'A')
{
c++;
j++;
}
else
{
flag = 1;
break;
}
}
if (flag == 1)
{
printf("NO\n");
continue;
}


if (c != (a*b)) //如果a,b,c的长度不符合条件,答案错误。
printf("NO\n");
else
printf("YES\n");

}


return 0;
}








猜你喜欢

转载自blog.csdn.net/yi976263092/article/details/78931895