PAT乙级1003(C语言)

博主分享了在解决PAT编程题时的心得体会,从混乱的初始思路到逐步清晰的解决方案。他们分析了题目的关键条件,提炼出检查字符串的有效策略,包括检查字符限制、PAT模式和对称性。最终,博主通过代码实现了一个自动裁判程序,并分享了编程过程中的感悟,强调了冷静分析和逐步完善的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 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.

这样就获得了满足通性的字符串,接着,在看看题目要求的条件。

  1. 字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 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哇哈!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值