这个题,我一开始拿到的时候是十分的懵逼的。当然这可能是我自己的理解能力有问题。】
本文参照https://blog.csdn.net/oShuaiFeng/article/details/80622269的代码和解释。
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符;- 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串;- 如果
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
但是问题是要被解决的。
所以我开始想的是,这样的意思,PAT位置任意,A个数不限,然后满足一个PAT的顺序既可以yes。
但是找到了很多人的解法和教程之后,我发现,好像不是这么回事。因为第三个条件, 如果 aPbTc
是正确的,那么 aPbATca
也是正确的,其中 a
、 b
、 c
均或者是空字符串,或者是仅由字母 A
组成的字符串。好像有一些意思,因为好像所有的小写字母都是A。那么其实就是这个意思,APATA正确,APAAtAA正确,这样的话,就刚好满足中间的A的个数乘以之前的A的个数等于后面的A的个数。
那么问题就变得十分简单,三个条件可以简化为:
1、不能包含PAT之外的字符。
2、PAT前后任意同等数目A,正确。
3、apbtc,a,b,c都是指A的数目,满足关系:a*b=c。
问题变得异常的简单。
#include <stdio.h>
#define med 2
#define bef 1
#define aft 3int main()
{
//定义接受的字符串
char arg[10] = {};
//获取字符串
scanf_s("%s",arg,10);
//PAT各自的个数
int P=0, A=0, T=0;
int state= bef;
int Before_Num=0, MED_Num=0, After_Num=0;
for (int i = 0; (i < sizeof(arg))&&(arg[i]!=0); i++)
{
if (*(arg + i) == 'P')
{
P++;
state = med;
printf("\r\n---------P---------\r\n");
}
else if (*(arg + i) == 'A')
{
A++;
printf("\r\n---------A---------\r\n");
}
else if (*(arg + i) == 'T')
{
T++;
state = aft;
printf("\r\n---------T---------\r\n");
}
else
{
printf("wrong char");
}
switch (state)
{
case 1:if (*(arg + i) == 'A')Before_Num++; break;
case 2:if(*(arg + i) == 'A')MED_Num++; break;
case 3:if (*(arg + i) == 'A')After_Num++; break;
}
}
printf("\r\n--------P:%dA:%dT:%d---------\r\n",P,A,T);
printf("\r\n--------Before_Num:%d MED_Num:%d After_Num:%d---------\r\n", Before_Num, MED_Num, After_Num);if ((P == 1) && (T == 1) && (Before_Num * MED_Num == After_Num) && (MED_Num >= 1))
{
printf("YES");
return true;
}}
下面是我的一个题目:
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符;- 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串;PPPATTPTTAT只要当中含有PAT,这个顺序的字符串,正确
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出
YES
,否则输出NO
。输入样例:
8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA
输出样例:
YES YES YES YES NO NO NO YES