PAT乙级.1003.我要通过

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
题意分析:


1)空字符串 不是 空格键 的意思。

2)根据1知
字符串中有且仅有‘P’‘A’‘T’三个字符。

3)根据2,3和输入样例可知:
输入必须包含一个P和一个T;

P和T的位置关系不能颠倒;

P之前A的个数 × P、T之间A的个数T之后的A的个数

     

#include <stdio.h>  //此代码运行正确
#include<string.h>
char str[1000];
int main()
{
    int i, n;
    
    scanf_s("%d", &n);
    while (n--)
    {
        int num, temp, aunt, p, t;        //此处变量为局部变量,写在全局变量处会导致程序出错
        num = 0; temp = 0; aunt = 0;     
        p = 0; t = 0;
        scanf_s("%s", str, 100);          //scanf_s为vs2017中用法,提交时将scanf_s改成scanf即可(将100删掉)
        for (i = 0; i <strlen(str); i++)
        {
            if (str[i] == P)
            {
                p = i;                  //p所在位置 从1开始计数
                num++;
            }
             if (str[i] == T)
            {
                t = i;                //t所在位置 从1开始计数
                temp++;
            }
             if (str[i] == A)
            {
                aunt++;                  //A的总个数

            }
        }
        if ((num + temp + aunt)!= strlen(str) || num > 1 || temp >1 || p*(t - p - 1) != strlen(str) - t-1||t-p<=1)
        {
            printf("NO\n");
        }
        else
        {
            printf("YES\n");
        }

    }
}

 



下面这个程序因为局部变量定义位置出错导致程序出错。


#include <stdio.h> //运行出错 #include<string.h> char str[1000]; int main() { int i, n; int num, temp, aunt, p, t; //此处变量为局部变量,写在全局变量处导致程序出错 num = 0; temp = 0; aunt = 0; // p = 0; t = 0; scanf_s("%d", &n); while (n--) { scanf_s("%s", str, 100); for (i = 0; i <strlen(str); i++) { if (str[i] == P) { p = i; //p所在位置从0开始计数 num++; } if (str[i] == T) { t = i; //t所在位置 从0开始计数 temp++; } if (str[i] == A) { aunt++; //A的总个数 } } if ((num + temp + aunt)!= strlen(str) || num > 1 || temp >1 || p*(t - p - 1) != strlen(str) - t-1||t-p<=1) { printf("NO\n"); } else { printf("YES\n"); } } }

 

以上是关于PAT乙级.1003.我要通过的主要内容,如果未能解决你的问题,请参考以下文章

[PAT乙级] Practise 1003 我要通过!

PAT乙级算法 1003 我要通过!

PAT乙级.1003.我要通过

PAT乙级 1003. 我要通过!

PAT乙级1003 我要通过! (20 分)详解

PAT乙级1003