🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### 题目描述 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。 得到“答案正确”的条件是: 1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符; 2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串; 3. 如果 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 ### 分析(伪代码和知识点) #### 1.合格字符串样式 PAT、xPbTx、aPATc、aPAATca(a、b、c都是A组成的字符串) ### 代码 ``` #include<stdio.h> #include<string.h> int reta(char *str) { int k=0,a=0; //定义两个整型变量 for(k=0;str[k]!='\0';k++) //字符串中没有P、A、T则返回-1 { if(str[k]!='P' && str[k]!='A' && str[k]!='T') return -1; } a=strspn(str,"A"); if(str[a]=='P') return a; else return -1; } int retb(char *str,int a) { int b=0; char *p; p=str+a+1; b=strspn(p,"A"); if(p[b]=='T') return b; else return -1; } int retc(char *str,int a,int b) { int c=0; char *p; p=str+a+b+2; c=strspn(p,"A"); if(p[c]=='\0') return c; else return -1; } int main(int argc, char *argv[]) { int n=0,i=0,j=0,a=0,b=0,c=0,r[10]={0}; char str[10][100]; //二维字符数组 scanf("%d",&n); //字符串输入个数 for(i=0;i<n && i<10;i++) //循环依次输入n个字符串 scanf("%s",str[i]); for(i=0;i<n && i<10;i++) { a=reta(str[i]); if(a!=-1) b=retb(str[i],a); else continue; if(b!=-1) c=retc(str[i],a,b); else continue; if(b>0 && c==b*a) r[i]=1; } for(i=0;i<n && i<10;i++) //循环依次输出每行匹配结果 { if(r[i]==0) //r[i]不等于0通过,否则不通过 printf("NO\n"); else printf("YES\n"); } return 0; } ```