PAT乙级1003(C语言)

得到“答案正确”的条件是:
1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串

 首先分析要求 (1):也就是字符串中只能有’P’ ‘A’ ‘T’三个字符。(2):要求二就是PAT字符串的左边和右边可以加相同个数的字符’A’,0个也是加,所以PAT APATA AAAPATAAA 这些都是符合要求的。(3):第三点尤要注意!!!!!首先是这个如果。如果 aPbTc 是正确的,也就是说这个aPbTc是符合要求**(1)(2)**的所以b必定是A或者A字符串,而a和c是相同数量的A。Ⅰa=c=空 b=A 所以 PAT是正确的所以 PAAT是正确的 所以PAAAT是正确的,Ⅱa=c=A 所以APATA是正确的,所以APAATAA是正确的,所以APAAATAAA是正确的。从这里可以知道每一次a不变对应下一次的b=b+1,c=a+c 可以得出P T之前A的个数乘P T之间A的个数=P T之后A的个数。
代码如下 要把打印信息关了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
	int num = 0;
	int i = 0,j = 0,flag=0;
	char str[10][100]; 
	int string_size = 0;
	int A_FRONT = 0,A_MIDDLE = 0,A_BEHIND = 0, P_FLAG = 0,T_FLAG = 0;
	
	
	scanf("%d",&num);   			/*字符串数量*/
	for(i=0;i<num;i++)
	{
		scanf("%s",str[i]);	        /* scanf不能char *所以用字符数组 */ 
	}
	
	/*judgement */
	for(i=0;i<num;i++)
	{
		string_size = strlen(str[i]);
		flag = 1;
		A_FRONT = 0;
		A_MIDDLE = 0;
		A_BEHIND = 0;
		P_FLAG = 0;
		T_FLAG = 0;
		
		for(j = 0;j<string_size;j++)
		{
			if (str[i][j]!='P' && str[i][j]!='A' && str[i][j]!='T')  /*只有PAT三个字符*/
			{
				printf("检测到非PAT字符\r\n"); 
				strcpy(str[i],"NO");
				flag = 0;
				break;
			}
			
			if(P_FLAG) //已经检测到P了  
			{	
				printf("aaaaa=%c\r\n",str[i][j]);		
				if(T_FLAG) //检测到T了,统计后面的A的个数 
				{
					if(str[i][j]!='A')
					{
						strcpy(str[i],"NO");
						flag = 0;
						break;
					}
						A_BEHIND ++;  //统计 PT后面的A的个数 
				} 
				
				else //没有检测到T说明统计PT之间A的个数 
				{	
					
					if(str[i][j] != 'T' && str[i][j] != 'A')
					{
						strcpy(str[i],"NO");
						flag = 0;
						break;
					}
					
					if(str[i][j] == 'T')
					{
						printf("检测到T\r\n");
						if(A_FRONT+A_MIDDLE +1 != j)
						{
							strcpy(str[i],"NO");
							flag = 0;
							break;
						}
						T_FLAG = 1;
					}
					
					else
					{
						A_MIDDLE ++;  //统计 PT后面的A的个数 
					}
					
					
				}
							
			}
			
			
			if(!P_FLAG) /*没检测到P所以只能是 P or A  并且统计PT前面的A的数量*/
			{
				printf("未检测到P\r\n");
				
				
				if(str[i][j]!='A' && str[i][j]!='P')  //既不是P也不是A 
				{
					strcpy(str[i],"NO");
					flag = 0;
					break;
				}
				
				
				if(str[i][j] =='P') /*检查到P*/
				{
					if(A_FRONT !=  j) //判断p前面的A数量 
					{
						strcpy(str[i],"NO");
						flag = 0;
						break;
					}	
					P_FLAG = 1;
					printf("检测到P\r\n");							
				}else
				{
					A_FRONT ++;  /*检测到A并且++*/
				}
			}
			
			
		}
		
		printf("A_FRONT=%d\r\n",A_FRONT);
		printf("A_MIDDLE=%d\r\n",A_MIDDLE);
		printf("A_BEHIND=%d\r\n",A_BEHIND);
		printf("flag=%d\r\n",flag);
		
		if(flag == 1)
		{
			if(A_MIDDLE == 0)		
			{
				strcpy(str[i],"NO");
			}	
			else if(A_FRONT*A_MIDDLE==A_BEHIND) 
			{
				strcpy(str[i],"YES");
			}
			else
			{
				strcpy(str[i],"NO");
			}
					
		} 
		
	}

    //print	
	for(i=0;i<num;i++)
	{
		printf("%s\r\n",str[i]);
	}
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值