PAT乙级-1003

     业精于勤,荒于嬉;行成于思,毁于随。

古人说的真没错,如果不能持之以恒的学习,整天想着娱乐,这样的人一生都会碌碌无为,如果不想成为庸碌的人,请时刻保持警惕!

1003 我要通过!(20)(20 分)

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

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

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;\

  1. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;\
  2. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (&lt10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。

输入样例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例: 

YES
YES
YES
YES
NO
NO
NO
NO

算法分析:该题有一定的难度,我花了大概两个小时才完成, 主要是要理解题意,条件:

  1. 告诉你xPATx都可以得到答案正确,这里x要么是空,要么是字符串A。
  2. 说如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。要注意的是a、b、c三者A的数量关系,根据这个条件,不难推出任意一个满足条件的字符串,均满足a*(b+1)=c.

接着就是确定数据结构了,这里可以用二维数组,也可以用链表,这里由于个人习惯用链表所以选择链表。

问题:

  1. 一开始苦于用那种数据结构,因为测试的数据不确定,而且输入的字符串长度不确定,最后确定定义List L[10]的数组(欢迎探讨)
  2. 没有审清楚题意,认为b中A的数量要么为1,要么为2.
#include <stdio.h>
#include <stdlib.h>

typedef struct LNode *List;
struct LNode{
	char n;
	List next;
};

List ReadInput();
int IsPAT(List L);
void Print(List L);
int main()
{
	List L[10],P;
	int n,i;
	while(scanf("%d",&n)!=EOF)
	{
	getchar();    /* 注意:该getchar是为了消除输入n按的回车 */ 
	for(i=0; i<n; i++)
		L[i] = ReadInput();
	for(i=0;i<n;i++)
	{
		if(IsPAT(L[i]))
			printf("YES\n");
		else	printf("NO\n");
	}}
	return 0;
}

List ReadInput()
{
	List P,L,t;
	L = (List)malloc(sizeof(struct LNode));
	P = L; 
	for(;;)
	{
		scanf("%c",&P->n);
		if(P->n == 10)  /* 判断是否为回车 */ 
		{
			t->next=NULL; 
			free(P);
			break;
		}
		t = P;
		P = (List)malloc(sizeof(struct LNode));
		t->next = P;
	}
	return L;
}

int IsPAT(List L)
{
	int a=0,b=0,c=0;     /* 记录a\b\c中A的个数,注意b多算了一个A*/ 
	List P = L;
	while(P!=NULL && P->n=='A')	
	{
		a++;
		P=P->next;                /* 判断a是否含有其他字符 */
	}
	if(P==NULL || P->n!='P')	                             
		return 0;
	P=P->next;
	while(P!=NULL && P->n=='A')              /* 记录字符PAbT b中'A'的数量*/ 
	{
		b++;
		P=P->next;
	}
	if(P==NULL || P->n!='T')                /* b中含有其他字符,返回0*/
		return 0;
	if(b==0)                    /* b中A=0,不满足PAT*/
		return 0; 
	P = P->next;
	while(P!=NULL)                        /* c中含有其他字符,返回0*/
	{
		if(P->n!='A')
			return 0;
		P=P->next;
		c++;                         
	}
	if(a*b==c)             
		return 1;
	else
		return 0;
}

void Print(List L)
{
	List P;
	for(P = L; P!=NULL; P=P->next)
			printf("%c",P->n);
	printf("\n");
}

猜你喜欢

转载自blog.csdn.net/bridge3/article/details/81097486