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。

输入样例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO


题目分析:
条件一:字符串只P、A、T这三种字母
条件二:形如xPATx正确,x可为空字符串,也可为仅含A的任意字符串,两个x字符串可不一样
条件三:只有由条件二推出的正确答案x1PATx2,即使(a=x1,b=A,c=x2)条件成立才满足aPbTc为正确答案,此时条件三才成立,则aPbATca(即x1PAATx2x1)为正确答案。条件三可继续推导当
x1PAATx2x1为正确答案时,即(a=x1,b=AA,c=x2x1)成立时,则aPbATca(即x1PAAATx2x1x1)为正确答案......

#include<stdio.h>
#include<malloc.h>
#include<string.h>
int judge(char a[]); 
int main()
{
    int n,i;
    scanf("%d",&n);
    char **a=(char **)malloc(sizeof(char*)*n);
    int *b=(int*)malloc(sizeof(int)*n);
    for(i=0;i<n;i++)
    {
        b[i]=0;
        a[i]=(char*)malloc(sizeof(char)*100);
        b[i]=0;
        scanf("%s",a[i]);
        b[i]=judge(a[i]);
    }
    for(i=0;i<n;i++)
    {
        if(b[i]==1)
        printf("YES\n");
        else
        printf("NO\n");
    }
    return 0;
 } 
int judge(char a[])
{
    int i,len=strlen(a),p=0,t=0,left,right,middle,temp;
    left=0;//P左边A的个数 
    middle=0;//P和T间A的个数 
    right=0;//T右边A的个数 
    
    for(i=0;i<len;i++)
    {
        if(a[i]!='A'&&a[i]!='P'&&a[i]!='T'||a[i]=='P'&&p==1||a[i]=='T'&&t==1||a[i]=='T'&&t==0&&p==0)//字符串中出现其他字符、P或T出现多次、T在P前出现 
        return 0;
        else if(p==0&&a[i]=='P') //P出现 
            p=1;    
        else if(a[i]=='T'&&t==0&&p==1)//T出现 
            t=1;
        else if(p==1&&a[i]=='A'&&t==0)//记录条件三几步推导 
            middle++;
        else if(p==0&&t==0&&a[i]=='A')
            left++;
        else if(p==1&&t==1&&a[i]=='A')
            right++;
    }
    temp=right-middle*left;
    if(p==0||t==0||middle==0)//P或T未出现,P、T间无A 
    return 0;
    else if(middle>1&&temp>=0||middle==1)
    return 1;
}

 




posted @ 2017-07-04 14:45  Stranger115  阅读(98)  评论(0编辑  收藏  举报