美文网首页PAT程序员
1003. 我要通过!(20)

1003. 我要通过!(20)

作者: tingshuo123 | 来源:发表于2017-07-30 10:53 被阅读205次

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

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

    1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
    2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串
    3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

    现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
    输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

    输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。

    思路:
    第一个要求简单,判断有没有除 PAT 以外的字符就可以了;
    第二个要求 PAT 两边有 n个‘A’ 组成的字符串,n 可以等于零;
    第三个要求,如果 aPbtc 正确的话, 由第二个要求可知必需有 b = 1;a = c; 也就可以得出:PAAT 左边有 n ‘A’ 组成的字符串,右边有 2n 个‘A’ 组成的字符串, 同样n可以等于零;

    输入样例

    8
    PAT
    PAAT
    AAPATAA
    AAPAATAAAA
    xPATx
    PT
    Whatever
    APAAATAA

    输出样例

    YES
    YES
    YES
    YES
    NO
    NO
    NO
    NO

    C语言实现:

    #include <stdio.h>
    #include <string.h>
    #define bool int
    #define true 1
    #define false 0
    #define size 101
    
    // 根据题意可以得出,可以通过的字符只有 xPATx, xPAATxx 这两种字符
    // 其中 x 是空字符,或者 'AA……'
    
    int main(void)
    {
        int n;
        scanf("%d", &n);
        char str[size];
        while (n--)
        {
            scanf("%s", &str);
            if (pass(str, strlen(str)) == true)
            {
                printf("YES\n");
            }
            else
            {
                printf("NO\n");
            }
        }
    
        return 0;
    }
    
    bool pass(char S[], int n)
    {
        // 检查字符
        int i;
        for (i = 0; i < n; i++)
        {
            if (!(S[i] == 'P' || S[i] == 'A' || S[i] == 'T'))
            {
                return false;
            }
        }
        char *p;
        // 条件2
        if ((p = strstr(S, "PAT")) != NULL)
        {
            if (p-&S[0] == &S[n-1]-p-2) {
                return true;
            }
        }
        // 条件3
        if ((p = strstr(S, "PAAT")) != NULL)
        {
            if ((2 * (p-&S[0]) == (&S[n-1]-p)-3)) {
                return true;
            }
        }
        return false;
    }
    
    

    部分通过, 改了半天没找出原因,不知道什么地方还没考虑到,累了,以后填。

    1.jpg

    相关文章

      网友评论

        本文标题:1003. 我要通过!(20)

        本文链接:https://www.haomeiwen.com/subject/abphlxtx.html