PAT (Basic Level) Practice (中文)T1003

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();
    }
  }
}

加油

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.breeze.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值