您的位置:首页 > 其它

1003. 我要通过!(20)-PAT乙级

2017-03-25 11:51 537 查看

题目:

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

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

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;

2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;

3. 如果 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

解答:

#include <string>
#include<iostream>
using namespace std;

//看了小女神(柳婼)的解法,这道题一个比较核心的思想是
//实践出真知,找到A出现次数的规律
//做题一定要备好纸和笔。
//同时不要忘了第一条要求

bool judge(string str)
{
int len = str.length();
if (len <= 2)//至少包含PAT三个
return false;
//判断数组中是否几个必出现的值是否出现过用以下方法。
bool book[3] = { false };//增加一个book标记三个字母是否出现过,##
//如果有一个字母没出现过,就要return false
for (int i = 0; i < len; i++)
{
if (str[i] == 'P')//##
book[0] = true;
else if (str[i] == 'A')
book[1] = true;
else if (str[i] == 'T')
book[2] = true;
else
return false;//##
if (str[i] == 'P')//当i遍历遇到P时
{
for (int j = 0; j < i; j++)//他前面一定有0或i-1个A
{
if (str[j] != 'A')
return false;
}
if (str[i + 1] != 'A')//P后面一定跟着至少一个A
return false;
for (int k = i + 2; k < len; k++)//从P后面的第二个数开始
{
if (str[k] != 'A')
{
//if (str[k] != 'T')//至少要有T
//{
//  return false;
//}
if ((len - 1 - k) != ((k - 1 - i) * i))//核心规则
return false;
//for (int m = k + 1; m < len; m++) //P之后一定有A
//{
//  if (str[m] != 'A')
//      return false;
//}
}
}
}
}
if (book[0] == false || book[1] == false || book[2] == false)//##
return false;//##
return true;
}

//bool judge2(string str)
//{
//  int len = str.length();
//  if (len <= 2)
//      return false;
//  bool book[3] = { false };
//  int k = 0,j=len-1;
//  for (int i=0; i < len; i++)
//  {
//      if (str[i] == 'P')
//          book[0] = true;
//      else if (str[i] == 'A')
//          book[1] = true;
//      else if (str[i] == 'T')
//          book[2] = true;
//      else
//          return false;
//  //  if (str[i] == 'P')//当i遍历遇到P时
//  //  {
//  //      for (int j = 0; j < i; j++)//他前面一定有0或i-1个A
//  //      {
//  //          if (str[j] != 'A')
//  //              return false;
//  //      }
//  //      if (str[i + 1] != 'A')//P后面一定跟着至少一个A
//  //          return false;
//  //      for (int k = i + 2; k < len; k++)//从P后面的第二个数开始
//  //      {
//  //          if (str[k] != 'A')
//  //          {
//  //              if ((len - 1 - k) != ((k - 1 - i) * i))//核心规则
//  //                  return false;
//  //          }
//  //      }
//  //  }
//  }
//  for (; str[k] != 'P'; k++);
//  for (; str[j] != 'T'; j--);
//  if ((len - 1 - j) != k*(j-k-2))
//      return;
//  if (book[0] == false || book[1] == false || book[2] == false)
//      return false;
//  return true;
//}

int main()
{
int n;
cin >> n;
string s;
for (int i = 0; i < n; i++) {
cin >> s;
if (judge(s) == true)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}


学到:

判断数组中是否几个必出现的值是否出现过用##所示方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: