首页 > 代码库 > PAT乙级 1003. 我要通过!
PAT乙级 1003. 我要通过!
题目:
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符; 2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串; 3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
思路:
首先第三个条件上来有个“如果”,这个明显是告诉有前提的,排除第一个条件后我们可以基本确定是通过第二个条件来推定,好了我们根据正则表达式的特点,知道基本是#PAT#的模型,所以就有PAT三个字母,因为题目要求每个测试输入包含1个测试用例,所以我们假设就是PAT作为正确的表达式,有第三个条件”aPbTc “正确,所以a和c都是null,b是A,同时”aPbATca”也是正确的,所以我们肯定”PAAT”也是正确的,我们把其再看成”aPbTc”型,就有”PAAAT”也是正确的;再来我们假定”APATA”正确,所以根据”aPbTc “,可以推的”APAATAA”正确,继续还有”APAAATAAA”等正确;可以看出 P前A的个数乘 P T中间的A的个数 等于T后A的个数。
对于第1个规则:0*0=0。对于第2个规则:x*1=x。对于第3个规则:aPbTc如果正确,那么b一定是A、a=c,bA就是AA,a*2=aa=ca。
代码:
#include<stdio.h> #include<string.h> int main() { char str[105]; int n,i; scanf("%d",&n); for(i=0;i<n;i++) { int a=0,b=0,c=0; //分别表示aPbTc中abc的长度 int flag=0; //判断是否有其他字符 int j,flag1=0,flag2=0; //表示是否经过P,T scanf("%s",str); for(j=0;j<strlen(str);j++) { if(str[j]==‘A‘||str[j]==‘P‘||str[j]==‘T‘) { if(str[j]==‘P‘) flag1=1; else if(str[j]==‘T‘) flag2=1; else{ if(flag1!=1) a++; if(flag1==1&&flag2!=1) b++; if(flag2==1) c++; } } else{ flag=1;break; } } if(a*b==c&&flag==0&&b!=0) printf("YES\n"); else printf("NO\n"); } return 0; }
PAT乙级 1003. 我要通过!