PAT-B 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

思路分析:

根据题目给出的三个条件,可以得出形如aPbTc格式的字符串,a b c分别代表相应位置上A字符的个数,有数量关系 a*b=c
当a b c均为仅由0个或多个A组成的字符串,且满足上述数量关系,即可给出“答案正确”。
main()函数中每读取一个字符串,直接输出结果。
handle_msg()函数的作用是字符串处理,方法是通过scanf的扫描集功能只读取含有A的字符串。

三个判断条件:

  1. len == a[0]+a[1]+a[2]+2 当有除了PAT以外的字符时,不能被scanf读取,所以总的字符串长度会比三段A(a[ ])加上PT(2)要长。
  2. a[1] != 0 中间的A数量不能为0。
  3. a[0]*a[1] == a[2] 即判断条件(a*b=c)。

代码:

#include <stdio.h>
#include <string.h>

int handle_msg(int a[]);

int main()
{
    int n = 0, store[3];

    scanf("%d", &n);
    for (int i = 0; i < n; i++) // 边读取边输出
        handle_msg(store) ? printf("YES\n") : printf("NO\n");

    return 0;
}

int handle_msg(int a[])
{
    char chr[101] = {0}, chr1[50] = {0}, chr2[101] = {0}, chr3[50] = {0};
    int len = 0;
    memset(a, 0, 3*sizeof(int));

    scanf("%s", chr);
    len = (int)strlen(chr); // 未处理的字符串长度
    sscanf(chr, "%[A]", chr1);
    a[0] = (int)strlen(chr1); // 获取第一段A的数量
    sscanf(chr+a[0], "P%[A]", chr2);
    a[1] = (int)strlen(chr2); // 获取第二段A的数量
    sscanf(chr+a[0]+a[1]+1, "T%[A]", chr3);
    a[2] = (int)strlen(chr3); // 获取第三段A的数量

    return (len == a[0]+a[1]+a[2]+2) && (a[1] != 0) && (a[0]*a[1] == a[2]);
}

点这里进入试题网页

你可能感兴趣的:(pat,乙级,简洁代码)