首页 > 代码库 > PAT乙级 1003. 我要通过!

PAT乙级 1003. 我要通过!

题目:

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

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

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

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


思路:

     首先第三个条件上来有个“如果”,这个明显是告诉有前提的,排除第一个条件后我们可以基本确定是通过第二个条件来推定,好了我们根据正则表达式的特点,知道基本是#PAT#的模型,所以就有PAT三个字母,因为题目要求每个测试输入包含1个测试用例,所以我们假设就是PAT作为正确的表达式,有第三个条件”aPbTc “正确,所以a和c都是null,b是A,同时”aPbATca”也是正确的,所以我们肯定”PAAT”也是正确的,我们把其再看成”aPbTc”型,就有”PAAAT”也是正确的;再来我们假定”APATA”正确,所以根据”aPbTc “,可以推的”APAATAA”正确,继续还有”APAAATAAA”等正确;可以看出 P前A的个数乘 P T中间的A的个数 等于T后A的个数。

  对于第1个规则:0*0=0。对于第2个规则:x*1=x。对于第3个规则:aPbTc如果正确,那么b一定是A、a=c,bA就是AA,a*2=aa=ca。

代码:

    

#include<stdio.h>
#include<string.h>
int main()
{
    char str[105]; 
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        int a=0,b=0,c=0; //分别表示aPbTc中abc的长度 
        int flag=0;  //判断是否有其他字符 
        int j,flag1=0,flag2=0; //表示是否经过P,T 
        scanf("%s",str);
        for(j=0;j<strlen(str);j++)
        {
            if(str[j]==A||str[j]==P||str[j]==T) 
            {
            if(str[j]==P) flag1=1;
            else if(str[j]==T) flag2=1;
            else{
                if(flag1!=1) a++;
                if(flag1==1&&flag2!=1) b++;
                if(flag2==1) c++;
                }
            }
            else{
                flag=1;break;
            }
        }
        if(a*b==c&&flag==0&&b!=0) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

 

 

  

 

PAT乙级 1003. 我要通过!