题目内容:
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于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
思路分析:
根据题目给出的三个条件,可以得出形如aPbTc格式的字符串,a b c分别代表相应位置上A字符的个数,有数量关系 a*b=c。
当a b c均为仅由0个或多个A组成的字符串,且满足上述数量关系,即可给出“答案正确”。
main()函数中每读取一个字符串,直接输出结果。
handle_msg()函数的作用是字符串处理,方法是通过scanf的扫描集功能只读取含有A的字符串。
三个判断条件:
- len == a[0]+a[1]+a[2]+2 当有除了PAT以外的字符时,不能被scanf读取,所以总的字符串长度会比三段A(a[ ])加上PT(2)要长。
- a[1] != 0 中间的A数量不能为0。
- a[0]*a[1] == a[2] 即判断条件(a*b=c)。
代码:
#include <stdio.h>
#include <string.h>
int handle_msg(int a[]);
int main()
{
int n = 0, store[3];
scanf("%d", &n);
for (int i = 0; i < n; i++) // 边读取边输出
handle_msg(store) ? printf("YES\n") : printf("NO\n");
return 0;
}
int handle_msg(int a[])
{
char chr[101] = {0}, chr1[50] = {0}, chr2[101] = {0}, chr3[50] = {0};
int len = 0;
memset(a, 0, 3*sizeof(int));
scanf("%s", chr);
len = (int)strlen(chr); // 未处理的字符串长度
sscanf(chr, "%[A]", chr1);
a[0] = (int)strlen(chr1); // 获取第一段A的数量
sscanf(chr+a[0], "P%[A]", chr2);
a[1] = (int)strlen(chr2); // 获取第二段A的数量
sscanf(chr+a[0]+a[1]+1, "T%[A]", chr3);
a[2] = (int)strlen(chr3); // 获取第三段A的数量
return (len == a[0]+a[1]+a[2]+2) && (a[1] != 0) && (a[0]*a[1] == a[2]);
}
本文介绍了一个自动判题程序的设计思路,用于判断字符串是否符合特定格式(仅含P,A,T字符,且满足特定组合规则),并提供了实现代码。
1003

被折叠的 条评论
为什么被折叠?



