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; }
学到:
判断数组中是否几个必出现的值是否出现过用##所示方法相关文章推荐
- PAT乙级 1003. 我要通过!(20)
- PAT乙级1003. 我要通过!(20)
- PAT 乙级练习题 1003. 我要通过!(20)
- 1003. 我要通过!(20) PAT乙级
- PAT 乙级 1003. 我要通过!(20) Java版
- PAT乙级—1003. 我要通过!(20)-native
- 1003. 我要通过!(20)-浙大PAT乙级真题
- [PAT乙级]1003. 我要通过!(20)
- 1003. 我要通过!(20) PAT乙级真题
- PAT-乙级-1003. 我要通过!(20)
- PAT乙级 1003. 我要通过!(20)
- 【PAT】(乙级)1003. 我要通过!(20)
- 浙江大学PAT乙级试题.1003. 我要通过!(20)C语言
- 1003. 我要通过!(20)--PAT乙级
- PAT训练(乙级)—— 1003. 我要通过!(20)
- pat乙级1003. 我要通过!(20)
- PAT_乙级1003. 我要通过!(20)
- pat 乙级 1003 我要通过!(20)
- PAT乙级 1003. 我要通过!(20)
- 浙江大学PAT_乙级_1003. 我要通过!(20)