• 我要通过_6


    我要通过 是 题目的名称,  a bit 狗血.

    答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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
    ==============================================
    IDEA:

    首先是逐行逐个接收字符的输入。

    共有两层循环,外循环次数与待判断字符串的组数是相等的。
    内层循环次数由字符串中的 字符个数决定的。
    用变量 X (char [102])存放 每次读入的字符串
    用变量 int X_len 来记录 X中记录 此次有效字符的 个数。

    外循环
    {

    内循环: 用以逐字接收字符,并对 特定的字符 出现位置、次数加以标记
    {
    如果接收到的字符是 除了 P A T
    之外的字符,用一个变量做标记,用于后续判断。

    在接收的时候,遇到字符 ‘P’
    记录P出现在字符串中的位置,用 int P来记录它
    记录出现 T 字符 在字符串中的位置, 用 int T 来记录它

    用变量 P_count 来记录 P 在字符串中出现的次数,
    用变量 T_count 来记录 T 字符在字符串中 出现的次数

    }

    将接收到的字符进行下列的 划分
    划分1:
    判断变量,根据变量的值判定字符串中是否出现了非
    'P'  ' A'  'T' 的字符,如果变量的值显示出 出现了 非要求字符,
    则 printf : NO

    划分2:在整个字符串中 P 和T 只允许 出现一次
    else if P_count== 1 && T_count==1
    {
        划分 2.1:针对 aPbTc
      

       首先,确定 P 的 位置 与T 的位置 之间只有一个字符,并且该字符为 'A'

     2.1 : if ( T-P == 2 && X[P+1] == 'A' )

     {

       然后,在该基础上在继续向下 验证:

      如果 aPbTc满足 xPATx  b 必定是 A 字符
     
        {a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串}
       

      即 abc 要么 全是 空串, 要么 全是 由 'A' 组成的字串。

     不过这么想是不对的, 题目中已经给出了 暗示 : PAT -> YES  而对于 PAT而言 : b 为 A , ac 均为 null ;

      这就说明   a b c 三者 在{null, A ,A...A,....}中进行选择 是允许不一致的。

       所以,找这里的 所有串 均是 : YES

     
     }   
        划分 2.2:      针对 aPbATac

      如果 aPbTc 满足 YES要求,即 xPATx ,则 aPbATac 必定满足,

      若 aPbTc 满足 YES:  b 必定 为'A', 而 a c 是什么 还不能够确定。

         所以 aPbATac 可以化为 aPAATac 的形式,即 若满足aPbATac 是 YES 的情况,必定b是要为 'A'的。

        <

      若b 为 空, 则 aPbTc 为 aPTc 不正确, aPbATac 必定错

          若b 为 A...A , 则 aPbTc 为 aPAA...ATc , 则aPbAA...ATac 也是错的。

      >

      所以,2.2 的判定条件 是 T 字符 位置与 P字符位置 相隔两个 字符

      且该两个字符 均为 A  ;然后再次在 这个基础上进行筛选。

        so 2.2:T - P == 3 && X[P+1] == 'A' && X[P+2] == 'A'

      {

        2.2.1: b 为 'A', a c 应该均为 'A' 组成的子串, 

         ac 长度 >= a 即可 证明 ;

        (因为:

         1.a = c = null : a = ac =0

         2. a != null c = null : a = ac

          3. a != null  c != null : a < ac

          4. a = nul  c != null : a < ac

        )

        同上面的表示法: a 子串的长度 = P 字符 在字符串 中出现的 位置 

        ac的长度 = 字符串最后字符 坐标(X_len-1)- T 在字符串中的 出现坐标 +1

        2.2.1 :if  P <= (X_len - T)

          print : YES

        2.2.2: NO 

      }

      2.3: print NO

    }

    划分3: 出现多次 P T 的情况 都是不满足要求的
    else
    {
        print :    NO
    }

    }//划分 3

    ==============================================
    SRC:
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int P,T , P_count, T_count,X_len ,i ;
        int loop ;
        char X[102] ,c ;
        int pass  ;
        
    
        scanf("%d", &loop) ;
        getchar() ;
    
        for ( i = 0 ; i < loop ; i++)
        {
            
        
            P = T = 0 ;
            P_count  = T_count =0 ;
            X_len = 0 ;
        
            memset ( X , 0 , sizeof(X) );
        
            while ( ~scanf ("%c", &c))
            {
    
                if ( c == '
    ' )
                    break ;
             
             
    
    
                switch(c)
                {
                case 'P':
                    P_count++ ;
                    P = X_len  ;
                    break ;
        
                case 'T':
                    T = X_len ;
                    T_count++ ;
                    break ;
                case 'A':
                    break ;
                default:
                 pass = -1 ;
                    break ;
                }
    
                X[X_len++] =  c ;
    
            }//while
         
            if ( pass == -1 )
            {
                printf("NO") ;
            }
        
            else if( P_count ==1 && T_count ==1 )
            {
                if ( (T - P == 2) && X[P+1] == 'A'  )
                {
                     
                     printf("YES") ;
                     
            
                }
                else if ( (T -P == 3) && (X[P+1]== 'A' && X[P+2]=='A'))
                {
                    if (P <= (X_len - T) )
                    {
                        printf("YES") ;
                    }
                    else
                    {
                        printf("NO") ;
                    }
    
                }
    
                else
                {
                    printf("NO") ;
                }
            
            }
            
            else
            {
                printf("NO") ;
            }
        }
    
        return 0 ;
    }
        
    
     

    // not pass yet ╮(╯▽╰)╭或许是判断 接收字符串结束的 回车 在判题系统中 不适用


  • 相关阅读:
    对Postmaster 对 SIGQUIT 信号处理的理解
    kill bgwriter 的小实验
    我对 execl 的学习
    pid_t 数据类型
    我对bgwriter.c 与 guc 关系的初步理解
    对Linux 下 SIGUSR1 与 SIGUSR2 的理解
    向bgwriter 发送 SIGQUIT 的实验
    常用txt图标符号
    也做网页图标favicon.ico
    TakeColor颜色拾取工具
  • 原文地址:https://www.cnblogs.com/inuyasha1027/p/pat_practice6.html
Copyright © 2020-2023  润新知