每日盘题——PAT(乙级1003)——我要通过!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21385857/article/details/88620068

/*
 * Copyright (c) 2014, 烟台大学计算机学院
 * All rights reserved.
 * 文件名称:test.cpp
 * 作    者:李晓凯
 * 完成日期:2019年 3 月 17 日
 * 版 本 号:v1.0
 *
 * 问题描述:
 * 输入描述:
 * 程序输出:

 */

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有 PAT这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 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

解题思路:

          暗藏玄机的一道题,1,2容易理解,第3条就有点懵了,其实是包含一个计算方法,要把字符串中A的个数分成三部分,P左边A的个数n1,P和T中间A的个数n2,T右边A的个数n3,如果n1*n2=n3,那么就是“答案正确”,否则就是“答案错误”,(注意P和T的个数只能是1个,多了就不符合了)如下:

         PAT:                            0*1=0

        PAAT:                           0*2=0

        AAPATAA:                    2*1=2

        AAPAATAAAA:               2*2=4

代码:

#include<iostream>
using namespace std;
void isPass(string str)
{
    bool flag;
    int p_num=0,p_site,t_num=0,t_site,a_num=0;
    int len=str.size();
    for(int i=0; i<len; i++)
    {
        if(str[i]!='P'&&str[i]!='A'&&str[i]!='T'){    //出现非P,A,T字符时就是答案错误
            flag=false;                               //标记答案错误
            break;                                    
        }
        else if(str[i]=='A')                          
            a_num++;                                  //记录A的数量,至少出现一次
        else if(str[i]=='P')                          
        {
            p_num++;                                  //记录P的数量
            p_site=i;                                 //标记P的位置
        }
        else if(str[i]=='T')
        {
            t_num++;                                  //记录T的数量
            t_site=i;                                 //标记T的位置
        }
    }
    if((a_num>=1)&&((p_site)*(t_site-p_site-1)==(len-1-t_site))&&(p_num==1)&&(t_num==1))
        //A至少出现一次,满足n1*n2=n3,P,T只能出现一次
        flag=true;                                    //标记答案正确
    else
        flag=false;                                   //标记答案错误
    if(flag)
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
}
int main()
{
    string str;
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>str;
        isPass(str);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_21385857/article/details/88620068
今日推荐