0
点赞
收藏
分享

微信扫一扫

PAT (Basic Level) Practice (中文)1003 我要通过——解析

玉字璧 2022-02-03 阅读 63

1003 我要通过! (20 分)

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

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

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

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

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

输入样例:

10
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
APATTAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO
NO
NO

 首先我们来看一下条件:

条件1:字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;

第一个条件是很好理解的,它的意思是字符串中只能够包含P、A、T三种字符,不能包含其他字符,且只能由1个P和1个T,P的位置要大于T的位置;

条件2:任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字               母 A 组成的字符串;

第二个条件满足条件1,要想该条件是正确的需要满足:①只有PAT3种字符且只能由1个P和1个T,P的位置要大于T的位置,P和T之间必须要有一个A;②P前的A的个数*P和T之间A的个数=T之后A的个数;我们可以给上述的xPATx来举个例子,如下:

PAT(x是空字符)——P之前A的个数是0,P和T之间A的个数是1,T之后A的个数是0,可以得到

                                     0*1=0(P前的A的个数*P和T之间A的个数=T之后A的个数

APATA——P之前A的个数是1,P和T之间A的个数是1,T之后A的个数是1,可以得到

                   1*1=1(P前的A的个数*P和T之间A的个数=T之后A的个数

AAPATAA——P之前A的个数是2,P和T之间A的个数是2,T之后A的个数是2,可以得到

                      2*1=2(P前的A的个数*P和T之间A的个数=T之后A的个数

AAAPATAAA——P之前A的个数是3,P和T之间A的个数是1,T之后A的个数是3,可以得到

                           3*1=3(P前的A的个数*P和T之间A的个数=T之后A的个数)

由此我们可以得出P前的A的个数*P和T之间A的个数=T之后A的个数;

条件3:如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或                 者是仅由字母 A 组成的字符串。

第三个条件满足条件2,该条件若想是正确的,就需要满足:①只有PAT3种字符且只能由1个P和1个T,P的位置要大于T的位置;②P前的A的个数*P和T之间A的个数=T之后A的个数;所以a=c,b=A,先对aPbTc进行讨论:

aPbTc:

            APATA(a=A,b=A,c=A)——1*1=1;

            AAPATAA(a=AA,b=A,c=AA)——2*1=2;

 再对aPbATca 进行讨论(aPbATca 若想正确,则aPbTc就必须正确,所以b=A,a=c;);

 aPbATca :               

                  APAATAA(a=A,b=A,c=AA)——1*2=2;

                 AAPAATAAAA(a=AA,b=A,c=AA)——2*2=4;

综上可知,若想输出答案正确,就需要满足一下几个条件:

①必须只有PAT3中字符,不能有其它字符;

②只能有1个P和T;

③P的位置要小于A的位置;

④P和T之间必须要有1个A;

⑤P前的A的个数*P和T之间A的个数=T之后A的个数;


       代码分析:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[100];//用来存储输入的字符;
    int n;//n (≤10)是需要检测的字符串长度
    scanf("%d",&n);
    int i,j;
    int m;//输入字符串的字节长度
    for(i=0;i<n;i++)
    {
        scanf("%s",arr);
        m=strlen(arr);
        int cont_P=0,cont_A=0,cont_T=0,cont_B=0;//分别是字符P、A、T和非PAT字符的字符个数,需要特别注意,定义这些变量的时候要定义再循环内,因为若定义在循环外的话,那么在循环一次后,这些变量的初始值将不再是0;
        int pos_P,pos_T;//分别是字符P和T位置
        for(j=0;j<m;j++)//判断字符是为PAT
        {
            if(arr[j]=='P')
            {
                cont_P++;
                pos_P=j;
            }else if(arr[j]=='T')
            {
                cont_T++;
                pos_T=j;
            }else if(arr[j]=='A')
            {
                cont_A++;
            }else
            {
                cont_B++;
            }
        }
        //printf("pos_P:%d,pos_T:%d\n",pos_P,pos_T);
        int a=pos_P;//若此处不懂可以自己举个例子看一下
        int b=pos_T-pos_P-1;
        int c=m-pos_T-1;
        //printf("a:%d,b:%d,c:%d\n",a,b,c);
        if(cont_B==0&&cont_P==1&&cont_T==1&&cont_A!=0&&b!=0&&pos_P-pos_T<0&&a*b==c)//判断输出的是yes还是no;
        {
            printf("YES\n");
        }else
        {
            printf("NO\n");
        }
    }
    return 0;
}

参考了(C语言最详细解析)1003 我要通过! (20 分)_暴力扬-CSDN博客_c语言1003

上面的都是自己在做题的时候的思路,如果有哪里不对的话,请指出来我会改正的,谢谢呀。

举报

相关推荐

0 条评论