1003 我要通过! (20 分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES
,否则输出 NO
。
输入样例:
10
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
APATTAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
首先我们来看一下条件:
条件1:字符串中必须仅有 P
、 A
、 T
这三种字符,不可以包含其它字符;
第一个条件是很好理解的,它的意思是字符串中只能够包含P、A、T三种字符,不能包含其他字符,且只能由1个P和1个T,P的位置要大于T的位置;
条件2:任意形如 xPATx
的字符串都可以获得“答案正确”,其中 x
或者是空字符串,或者是仅由字 母 A
组成的字符串;
第二个条件满足条件1,要想该条件是正确的需要满足:①只有PAT3种字符且只能由1个P和1个T,P的位置要大于T的位置,P和T之间必须要有一个A;②P前的A的个数*P和T之间A的个数=T之后A的个数;我们可以给上述的xPATx来举个例子,如下:
PAT(x是空字符)——P之前A的个数是0,P和T之间A的个数是1,T之后A的个数是0,可以得到
0*1=0(P前的A的个数*P和T之间A的个数=T之后A的个数)
APATA——P之前A的个数是1,P和T之间A的个数是1,T之后A的个数是1,可以得到
1*1=1(P前的A的个数*P和T之间A的个数=T之后A的个数)
AAPATAA——P之前A的个数是2,P和T之间A的个数是2,T之后A的个数是2,可以得到
2*1=2(P前的A的个数*P和T之间A的个数=T之后A的个数)
AAAPATAAA——P之前A的个数是3,P和T之间A的个数是1,T之后A的个数是3,可以得到
3*1=3(P前的A的个数*P和T之间A的个数=T之后A的个数)
由此我们可以得出P前的A的个数*P和T之间A的个数=T之后A的个数;
条件3:如果 aPbTc
是正确的,那么 aPbATca
也是正确的,其中 a
、 b
、 c
均或者是空字符串,或 者是仅由字母 A
组成的字符串。
第三个条件满足条件2,该条件若想是正确的,就需要满足:①只有PAT3种字符且只能由1个P和1个T,P的位置要大于T的位置;②P前的A的个数*P和T之间A的个数=T之后A的个数;所以a=c,b=A,先对aPbTc进行讨论:
aPbTc:
APATA(a=A,b=A,c=A)——1*1=1;
AAPATAA(a=AA,b=A,c=AA)——2*1=2;
再对aPbATca
进行讨论(aPbATca
若想正确,则aPbTc就必须正确,所以b=A,a=c;
);
aPbATca
:
APAATAA(a=A,b=A,c=AA)——1*2=2;
AAPAATAAAA(a=AA,b=A,c=AA)——2*2=4;
综上可知,若想输出答案正确,就需要满足一下几个条件:
①必须只有PAT3中字符,不能有其它字符;
②只能有1个P和T;
③P的位置要小于A的位置;
④P和T之间必须要有1个A;
⑤P前的A的个数*P和T之间A的个数=T之后A的个数;
代码分析:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[100];//用来存储输入的字符;
int n;//n (≤10)是需要检测的字符串长度
scanf("%d",&n);
int i,j;
int m;//输入字符串的字节长度
for(i=0;i<n;i++)
{
scanf("%s",arr);
m=strlen(arr);
int cont_P=0,cont_A=0,cont_T=0,cont_B=0;//分别是字符P、A、T和非PAT字符的字符个数,需要特别注意,定义这些变量的时候要定义再循环内,因为若定义在循环外的话,那么在循环一次后,这些变量的初始值将不再是0;
int pos_P,pos_T;//分别是字符P和T位置
for(j=0;j<m;j++)//判断字符是为PAT
{
if(arr[j]=='P')
{
cont_P++;
pos_P=j;
}else if(arr[j]=='T')
{
cont_T++;
pos_T=j;
}else if(arr[j]=='A')
{
cont_A++;
}else
{
cont_B++;
}
}
//printf("pos_P:%d,pos_T:%d\n",pos_P,pos_T);
int a=pos_P;//若此处不懂可以自己举个例子看一下
int b=pos_T-pos_P-1;
int c=m-pos_T-1;
//printf("a:%d,b:%d,c:%d\n",a,b,c);
if(cont_B==0&&cont_P==1&&cont_T==1&&cont_A!=0&&b!=0&&pos_P-pos_T<0&&a*b==c)//判断输出的是yes还是no;
{
printf("YES\n");
}else
{
printf("NO\n");
}
}
return 0;
}
参考了(C语言最详细解析)1003 我要通过! (20 分)_暴力扬-CSDN博客_c语言1003
上面的都是自己在做题的时候的思路,如果有哪里不对的话,请指出来我会改正的,谢谢呀。