我要通过_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 ╮(╯▽╰)╭或许是判断 接收字符串结束的 回车 在判题系统中 不适用


原文地址:https://www.cnblogs.com/inuyasha1027/p/pat_practice6.html