PAT 题目 1003 我要通过! (20 分)

     一开始看到这道题以为题目有问题 只是自己没有好好看题目

1、字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;

(这个要求的意思是 不能有除了PAT外其他字符)

 

2、任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;

(这句话的意思是 xPATx中除PAT这个字符串不能变 x可以改为空字符串(不是空格)或仅有A组成的字符串 即   PAT APATA AAPATAA AAAPATAAA ....依次类推 可以理解为以PAT为基准 往其左右两边分别放入等量的A)

 

3、如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

(这句话是这题最难懂的 其中正确的aPbTc的来源有两种.      

第一种,来自第二个要求中的PAT APATA AAPATAA...,这里以AAPATAA为例子 a=AA b=A c=AA 则带入aPbATca可知其内容为 AAPAATAAAA   

第二种,来自第三个要求中的正确项,如上面举例后得出的AAPAATAAAA 其中 a=AA b=AA c=AAAA 则带入aPbATca可知其内容为 AAPAAATAAAAAA 这个结果又可以带入 aPbTc)

 

能看出规律是  P左边的A的数量 * 即在P右边又在T左边的A的数量 =T右边的A的数量 

#include<stdio.h>
#define N 110

int yesorno(char *s)
{
    int i=0,a=0,b=0,c=0,p=0,t=0;
    while(s[i]!='\0')
    {


        if(s[i]!='A' && s[i]!='P' && s[i]!='T' &&s[i]!=' ')    //判断有没有其他字符          
            return 0;

            
        if(s[i]=='A' &&p==0 && t==0)                          //记录P左A的数量  
        {
            a++;
        }
        if(s[i]=='A' &&p!=0 && t==0)                          //记录P右T左A的数量 
        {
            b++;
        }
        if(s[i]=='A' &&p!=0 && t!=0)                          //记录T右A的数量 
        { 
            c++;
        }                                                              


        if(s[i]=='P' && p==0){                                
            p=i+1;
        }else if(p!=0 && s[i]=='P'){                           //如果不止一个P
            {
            return 0;
        }
        }
        if(s[i]=='T' && t==0){
            t=i+1;
        }else if(t!=0 && s[i]=='T'){                            //如果不止一个T
            {
            return 0;
        }
        }
        
        i++;
    }
    if(b==0)                                                     //如果PT中间没有A  说明输入的格式可能为APT 或者 TAP  这两种主要情况
                           
        return 0;
    if(c==a*b && p!=0 && t!=0)                                // a*b=c 并且 p!=0 t!=0  
    {
        return 1;
    }
      return 0;
}
int main()
{
    int n,i;
    char s[N];
    if(scanf("%d",&n)==1)
    {
     if(n<10)
     {
         for(i=0;i<n;i++)
         {
             if(scanf("%s",s)==1)
             {
             if(yesorno(s))
             {
                  printf("YES");
             }else{
                  printf("NO");
             }
                 if(i!=n-1)
                  printf("\n");
        }
        
    }   
     }
     
}
    
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值