PAT 1003我要通过!

1003 我要通过!(20)(20 分)

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (&lt10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO



解析

做这题的时候,我怀疑我的语文是不是体育老师教的(#`-_ゝ-)。
这题要根据给的三个条件推测出能YES的字符串。
条件一: 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
这不用说,
条件二: 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
这也不用说
条件三:如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
aPbTc怎样才能是正确的呢?(我们现在只有2个条件)。那就是a和c中的A个数一样,b只能是A.由此,我们推出:
如果 aPATa 是正确的,那么 aPAATaa 也是正确的,其中 a或者是空字符串,或者是仅由字母 A 组成的字符串.
那么,照着这个条件递推,我们就能得到条件三要告诉我们的关系式了。

这里写图片描述
即: 后缀a字符串的个数 = 前缀a字符串的个数 * PAT中A的个数
warning:
a可能是空字符串,所以PAT能过,PAAT也能过,PAAAT也行。,,,,,,


在代码里,我专门写了一个函数用来判断是否为正确字符串,如果是,返回1,否则返回0.

int judgt(char *string)
{
  int i=1;
  int length = strlen(string);
  if(string[0] == 'P'){                        //this  case is PAT
    while(i != (length-1)){                   //if begin is             
        if(string[i++] !='A')                 //then this string must
            return 0;                        // p(n A)T 
        }  
    if(i ==1 || string[i] != 'T')
        return 0;
    else
        return 1;                    

  }
  else if(string[0] == 'A'){                  //this case is aP..A..Tcaaa
    int prefix =1;  
    int infix=0;
    int suffix = 0;
    while(string[i] =='A'){                 //process a,get prefix A
        prefix++;
        i++;
    }
    if(string[i++] !='P')                  //P
        return 0;
    while(string[i] =='A'){                //process b,get infix A
        infix++;
        i++;
    }
    if(infix == 0)               
        return 0;
    if(string[i++] !='T')
        return 0;
    suffix = prefix * infix;
    int j=0;    
    while(string[i] =='A'){
        j++;
        i++;
    }
    if(j !=suffix)
        return 0;
    else 
        return 1;
  }
  else
    return 0;
}



完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int judgt(char *string)
{
  int i=1;
  int length = strlen(string);
  if(string[0] == 'P'){                        //this  case is PAT
    while(i != (length-1)){                //if begin is            
        if(string[i++] !='A')          //then this string must
            return 0;              // p(n A)T 
        }  
    if(i ==1 || string[i] != 'T')
        return 0;
    else
        return 1;                    

  }
  else if(string[0] == 'A'){                  //this case is aP..A..T case
    int prefix =1;  
    int infix=0;
    int suffix = 0;
    while(string[i] =='A'){                   //process a,get prefix A
        prefix++;
        i++;
    }
    if(string[i++] !='P')                    //P
        return 0;
    while(string[i] =='A'){                 //process b,get infix A
        infix++;
        i++;
    }
    if(infix == 0)               
        return 0;
    if(string[i++] !='T')
        return 0;
    suffix = prefix * infix;
    int j=0;    
    while(string[i] =='A'){
        j++;
        i++;
    }
    if(j !=suffix)
        return 0;
    else 
        return 1;
  }
  else
    return 0;
}
int main()
{
  int string_number=0;
  scanf("%d",&string_number);
  int i=0;
  char** string = malloc(string_number*sizeof(char *));
  for(i=0;i<string_number;i++)
    *(string+i) = malloc(100*sizeof(char));
  i=0;
  while(i !=string_number){
   scanf("%s",*(string+i));
    i++;
  }
  i=0;
  int result =0;
  while(i !=string_number){
    result = judgt(*(string+i));
    if(result == 1)
        printf("YES\n");
    else
        printf("NO\n");
    i++;
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41256413/article/details/80942332