(PAT-Basic)1003. 我要通过

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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
 
  
分析题目:要求1说明只能存在PAT三个字符组成的字符串,然鹅第二第三个规律 光光按要求来看,是不够的。需要归纳总结规律。
形如xPATx正确,如果 aPbTc 是正确的,那么 aPbATca 也是正确的。那么说b肯定是A,a==c(a,c同为A的字符串)(根据要求二),,那样PT中间是AA,
这样看,猜测,P之前的A的数量*PT中间的A的数量是否等于T后A的数量?看着四个正确的例子 完美符合。。就这样连猜带蒙的做出来了。
上代码
 
  
#include
#include

using namespace std;
bool Requirement1st(char *str);
bool Requirement2nd(char *str);
bool Requirement3rd(char *str, int p, int a, int t);

bool Requirement1st(char *str)//check whether other characters exist in string and PAT exist
{
	int len=strlen(str);
	bool flag=true;
	bool flag_P = false;
	bool flag_A = false;
	bool flag_T = false;
	for (int i = 0; i < len; i++)
	{
		if (str[i]=='P')
		{
			flag_P = true;
		}
		else if (str[i]=='A')
		{
			flag_A = true;
		}
		else if (str[i]=='T')
		{
			flag_T = true;
		}
		else//exist other character
		{
			flag_P = false;
			break;
		}
	}
	flag = flag_A && flag_P && flag_T;
	return flag&&Requirement2nd(str);
}

bool Requirement2nd(char *str)//check whether achieve the xPATx requirement;
{
	int len = strlen(str);
	int p, a, t;
	bool flag = true;
	bool first_p = true;

	bool flag_P = false;
	bool flag_A = false;
	bool flag_T = false;

	for (int i = 0; i < len; i++)
	{
		if (str[i] == 'P')
		{
			flag_P = true;
			if (first_p)
			{
				p = i;
				first_p = false;
			}
		}
		else if (str[i] == 'A'&&flag_P)
		{
			flag_A = true;
			a = i;
		}
		else if (str[i] == 'T'&&flag_A)
		{
			flag_T = true;
			t = i;
		}
		
	}
	flag = flag_P && flag_A && flag_T;
	return flag && Requirement3rd(str,p,a,t);
}
bool Requirement3rd(char *str,int p,int a,int t)//p->the last P 
{
	int len = strlen(str);
	bool flag = true;
	 

	for (int i = p+1; i < t; i++)
	{
		if (str[i] != 'A') {
			flag = false;
			break;
		}
	}
	flag = flag && (p*(t-p-1)==(len-1-t));
	return flag;
}


int main()
{
	int n;
	char str[20][100];
	bool flags[20];
	cin >> n;

	for (int  i = 0; i < n; i++)
	{
		cin >> str[i];
	}
	for (int  i = 0; i < n; i++)
	{
		flags[i]=Requirement1st(str[i]);
	}
	for (int i = 0; i < n; i++)
	{
		if (flags[i])
		{
			cout << "YES" << endl;
		}
		else {
			cout << "NO" << endl;
		}
	}
	system("PAUSE");
	return 0;
}


你可能感兴趣的:((PAT-Basic)1003. 我要通过)