1003我要通过
个人水平有限,如有不对的地方请指出,谢谢。
题目
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
个人理解:
1.仅包含P,A,T三种字符,包含其他字符答案错误
2.条件2,3可以看作一个条件:P前的A的个数与P与T之间A的个数的乘积是T之后A的个数。
3.条件二的解释:xPATx,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;这里PT之间A的个数是1,x中A的个数乘以PT之间A的个数(这里是1)就是x中A的个数。
4.在题目中可以看出P,T的个数只能为1.
综上这个题目的条件总结一下:
1.只能含有P,A,T三种字符且P和T的字符出现次数只有一次。(P一定要在T之前,当然没在的话依然能通过,但是有逃课的感觉??)
2.P前的A的个数与P与T之间A的个数的乘积是T之后A的个数。
思路
1.基本判断采用函数
2.首先判断输入的字符串是否含有其他字符,如果有直接NO。
3.确定P,T的出现次数是否为1,不满足直接NO。
4.统计P之前A的个数,P,T之间A的个数,T之后A的个数,不满足条件三直接NO。
5.以上条件都满足则 YES
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
bool check(char* s, int len) { //检查字符串是否只含有P,A,T三种字符
int p, a, t; //P,A,T标志
int pl, tl; //p和t的位置
p = a = t = 0;
for (int i = 0;i < len;i++) {
if (s[i] != 'P' && s[i] != 'A' && s[i] != 'T')
return false;
if (s[i] == 'P') {
p++; //P的个数
pl = i;
}
if (s[i] == 'T') {
t++; //T的个数
tl = i;
}
if (s[i] == 'A')
a = 1;
}
if (p + t + a == 3 && pl < tl) //只能含有一个P和T
return true;
else
return false;
}
int main() {
char s[101];
int flag = 0;
scanf("%d", &flag);
getchar();
int len = 0;
for (int i = 0;i < flag;i++) {
scanf("%s", &s);
len = strlen(s);
if (check(s, len)) {
int p, t; //P和T的位置
p = t = 0;
for (int n = 0;n < len; n++) { //获得第一个P和第一个T的位置
if (s[n] == 'P')
p = n;
if (s[n] == 'T')
t = n;
}
if (p * (t - p - 1) == (len - t - 1))
printf("YES\n");
else
printf("NO\n");
}
else printf("NO\n");
}
return 0;
}