“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的
题目如上,我想就这道题分享一下我的体验领悟。
刚开始时我的思路是从第一个字符开始检验 P前不是A就NO,P后T前不是A也NO,T后不是A也NO,可是写完发现思路越写越混,好多细节没注意,最后成了mass?!
我开始冷静下来,以题目为关注重点,仔细分析将它分为3步。
1。排除不含PAT的字符串
2。检查该字符串是否有PAT,或PAAT,,,
3。除PAT外其余位置都是A
然后我开始就这几个步骤开始写,越写越有灵感,猛然发觉,1,2步可以用一个思路解决
符合要求的字符串都是这样的,1,字符串只含有一个P,一个T,其余全是A 2,P必在T后
3,PT间不能无符号。
接着,1可以用,遍历得出A个数,+2判断与字符串总数是否相同(不是,意味着不是含2个不是A其余都是A的字符的字符串),用t,p标记TP的位置,初始设>100的数,若遍历后与初始值一样,说明那两个位置并非T或P,也排除。 那么,2可以用判断是否p < t解决,3则是t = p+1.
这样就获得了满足通性的字符串,接着,在看看题目要求的条件。
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
第1,我们已经解决。第2,要求字符串在 PAT 这里严格对称,并且我们还观察到中间只有一个A,那么解决方法是,用T右边A的个数除TP中间的一个A,判断结果是否与P左边的A的 个数相同,√,第3,要求P左边A与PT间A与T右边A个数相同,或者中间比左边多一个,右边为左边2倍,那么解决办法是,左=mid=右 || mid=left+1 && right/left==0
OK,问题解决了,以下是我的原始代码
#include <stdio.h>
#include <string.h>
int main(){
char pat[100];
int n;
int p = 102,t = 102;
int sum = 0,j,a = 0;
int f = 0;
int right,mid;
scanf("%d",&n);
for(int i = 0;i<n;i++){ //第一步,循环找出含pat格式的字符串(xxxpatxx)
scanf("%s",pat); //之类的
j = 0;a = 0;p = 102;t = 102;f = 0;sum = 0;
while(pat[j]){
if(pat[j] == 'A') a++; //找出字符串中所有A
if(pat[j] == 'P') p = j; //找出P所在位置
if(pat[j] == 'T') t = j; //T位置
j++;
}
if(strlen(pat) != a+2){ //排除,不是,除PT外都是A的字符串
printf("NO");
continue;
}
if(p > t || t == p+1 || p == 102 || t == 102){
printf("NO");continue; //排除PT之间无空格或A的字符串,TP,以及不是PT
}
right = strlen(pat)-t-1; //T右边
mid = t-p-1; //PT之间,下面是排列的格式选择,不符合条件的PASS
if(p == (right)/mid || right == mid && right == p || right%p == 0 && p == mid-1){
printf("YES");continue;
}
else{
printf("NO");
continue;
}
}
return 0;
}
其实,在推翻之前的思路重新做的思路也有问题,可是,正是因为一步步列出来,让我的思路有处安放,然后越来越有灵感,最后慢慢完善,再次审题,再完善。
真的非常感谢您能看到这(哭了),在这里记录一方面是想锻炼自己表达能力,一方面记录学习编程的过程收获及感悟,还有一方面也是想和各位伙伴共同探讨, 一起进步,也希望我的代码能对你们有一点点帮助,Y哇哈!