PAT (Basic Level) Practice (中文)T1003
题目:
只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
条件:
1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
说一下我遇到的问题:
1.首先是题目的理解问题,第三个条件需要自己举例找规律,发现需要满足a*b=c。
2.是重复输出no的问题,我在函数体里面for循环里面原本判断含有pat外字符就输出no,但这样会造成break跳出for循环后再次进入if做判断导致再次输出no,所以我多设置了一个变量q,当for里面判断含有pat外的字符后p变为1,这样break之后再进入for循环外的if判断里可以添加p为1时输出no,就可避免该情况。
3.该题我最后用了for去遍历每一个字符串,原本想用cin.get(ch)的,但发现这个会取到最开始打的正整数n(我代码中输入的数字in)。所以最后放弃了这个想法。
4.为保障整个字符串只有一个p和一个t,我选择建立变量去计数,最后判断该变量的值是否符合。a的出现和位置有关,所以需要分三种位置情况。
代码如下:
#include <iostream>
using namespace std;
void test() {
int aleft = 0, amiddle = 0, aright = 0, p = 0, t = 0,q=0;
string ch;
cin>>ch;
int s = ch.size();
for (int i = 0; i < s; i++) {
if (ch[i] != 'P' && ch[i] != 'A' && ch[i] != 'T') {
break;q=1;
} else {
if (ch[i] == 'A'&&p==0&&t==0) {
aleft++;
}else if(ch[i]=='A'&&p==1&&t==0){amiddle++;}
else if(ch[i]=='A'&&p==1&&t==1){aright++;}
else if (ch[i] == 'P') {
p++;
} else {
t++;
}
}
}
if (aleft * amiddle == aright && p == 1 && t == 1&&aleft+aright+amiddle>0) {
cout << "YES" << endl;
} else if(aleft * amiddle != aright||p==0||t==0) {
cout << "NO" << endl;
}else if(q=1){cout << "NO" << endl;}}
int main() {
int in;
cin >> in;
if (in < 10) {
for (int i = 0; i < in; i++) {
test();
}
}
}
加油