本文共 2596 字,大约阅读时间需要 8 分钟。
1003 我要通过! (20分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。得到“答案正确”的条件是:
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。输入样例:
8PATPAATAAPATAAAAPAATAAAAxPATxPTWhateverAPAAATAA
输出样例:
YESYESYESYESNONONONO
思路分析:
条件1:字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
条件2:任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
条件3:如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A组成的字符串。
代码实现:
// 此处给出两种写法// 这里的两种写法虽然写法不同,但是思想是一致的// 写法一#includeusing namespace std;void solve() { int x; scanf("%d", &x); getchar(); for (int i = 0; i < x; i++) { int Aqnum = 0, Aznum = 0, Ahnum = 0; int P, A, T; P = A = T = 0; // P A T 的个数 int rp = 1; // 控制 是 P 前 还是 P~T之间 和 T 之后的变量 【1 2 3 前中后】 int cnd = 1; // 若含有其他字符就改为 0 for (char s; s=getchar(), s != '\n';) { s == 'P' ? P++, rp = 2 : s == 'A' ? A++ : s == 'T' ? T++, rp = 3 : cnd = 0; // 可以使用if来写 其实也就是这个意思。 switch (rp) { case 1:Aqnum++; break; // 前 case 2:if (s != 'P') Aznum++; break; // 中 case 3:if (s != 'T') Ahnum++; break; // 后 } } if (P == 1 && A &&T == 1 && Aznum != 0 && Aqnum*Aznum == Ahnum && cnd) // 只有1个P 只有1个T 并且满足乘法 还满足 没有其他字符的话 printf("YES\n"); else printf("NO\n"); }}int main() { solve(); return 0;}// 写法二#include #include #include using namespace std;int main(){ int t; scanf("%d",&t); char s[107]; while(t--) { int Pflag=0,Tflag=0; //P所在位置的下标,T所在位置的下标 int anum=0,pnum=0,tnum=0; //A的数量,P的数量,T的数量 int aanum=0,banum=0,canum=0; //P左边的A的数量,P和T中间A的数量,T右边的A的数量 scanf("%s",s); for(int i=0;i
运行结果图:
转载地址:http://nqoi.baihongyu.com/