//1003 我要通过!(20)(20 分)
//“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
//得到“答案正确”的条件是:
//1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
//任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
//如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
//现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
//输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
//输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
//输入样例:
//8
//PAT
//PAAT
//AAPATAA
//AAPAATAAAA
//xPATx
//PT
//Whatever
//APAAATAA
//输出样例:
//YES
//YES
//YES
//YES
//NO
//NO
//NO
//NO
C:
#include
int main(int argc, const char * argv[]) {
int n = 0;
char c;
scanf("%d",&n);//输入字符串个数n
while (getchar() != '\n');//接收字符串,直到回车
for (int i = 0; i < n; i++) { //对1-n个字符串做处理
int pos = 0;//pos用来检查PAT的顺序,也作为P前、P&T、T后三部分的索引
int cnt[3] = {0,0,0};//P前、P&T、T后三部分中A的个数,这里需要注意pos和cnt必须在for循环里,\
//每个字符串都要重新初始化,在这里我出了错误
while((c = getchar()) != '\n')//逐个字符读取
{
if (c == 'A') { //当前字符为A
cnt[pos]++;//统计当前块的A的个数
}else if(c == 'P' && pos == 0)//当前字符为P,并且前面只出现空字符或A
{
pos =1;
}else if (c == 'T' && pos == 1)//当前字符为T,并且前面出现了字符P
{
pos =2;
}else break;//跳出当前while循环
}
if (pos == 2 && c == '\n' && cnt[1] && (cnt[0] * cnt[1]) == cnt[2]) {
//pos == 2 表示当前字符处理到T后\
// c == '\n' 表示当前字符处理到回车\
// cnt[1] 表示PT之间存在A\
// cnt[0] * cnt[1] == cnt[2])表示P前A的个数*P&TA的个数==T后A的个数
printf("YES\n");
}else printf("NO\n");
if (c != '\n') {//这段代码是为了将当前字符串处理完,比如输入BCD,处理到B时break,后续字符无法处理,直接读完即可
while ((c = getchar()) != '\n');
}
}
return 0;
}
网友评论