zoukankan      html  css  js  c++  java
  • 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
    ");
            else
            printf("NO
    ");
        }
        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;
    }



  • 相关阅读:
    一文学会Go语言
    只用120行Java代码写一个自己的区块链
    精通libGDX游戏开发-RPG实战-欢迎来到RPG的世界
    精通libGDX游戏开发-RPG实战-开发游戏的基本前提
    libGDX开发环境搭建-Android Studio 最新版
    linux下redis的最佳实践(Master-Slave)
    使用Redis实现高并发分布式序列号生成服务
    [libGDX游戏开发教程]使用libGDX进行游戏开发(12)-Action动画
    [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader
    [libgdx游戏开发教程]使用Libgdx进行游戏开发(10)-音乐和音效
  • 原文地址:https://www.cnblogs.com/myanswer/p/7116630.html
Copyright © 2011-2022 走看看