我要通过 是 题目的名称, a bit 狗血.
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输入样例:8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA输出样例:
YES YES YES YES NO NO NO NO ==============================================
IDEA:
首先是逐行逐个接收字符的输入。
共有两层循环,外循环次数与待判断字符串的组数是相等的。
内层循环次数由字符串中的 字符个数决定的。
用变量 X (char [102])存放 每次读入的字符串
用变量 int X_len 来记录 X中记录 此次有效字符的 个数。
外循环
{
内循环: 用以逐字接收字符,并对 特定的字符 出现位置、次数加以标记
{
如果接收到的字符是 除了 P A T
之外的字符,用一个变量做标记,用于后续判断。
在接收的时候,遇到字符 ‘P’
记录P出现在字符串中的位置,用 int P来记录它
记录出现 T 字符 在字符串中的位置, 用 int T 来记录它
用变量 P_count 来记录 P 在字符串中出现的次数,
用变量 T_count 来记录 T 字符在字符串中 出现的次数
}
将接收到的字符进行下列的 划分
划分1:
判断变量,根据变量的值判定字符串中是否出现了非
'P' ' A' 'T' 的字符,如果变量的值显示出 出现了 非要求字符,
则 printf : NO
划分2:在整个字符串中 P 和T 只允许 出现一次
else if P_count== 1 && T_count==1
{
划分 2.1:针对 aPbTc
首先,确定 P 的 位置 与T 的位置 之间只有一个字符,并且该字符为 'A'
2.1 : if ( T-P == 2 && X[P+1] == 'A' )
{
然后,在该基础上在继续向下 验证:
如果 aPbTc满足 xPATx b 必定是 A 字符
{a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串}
即 abc 要么 全是 空串, 要么 全是 由 'A' 组成的字串。
不过这么想是不对的, 题目中已经给出了 暗示 : PAT -> YES 而对于 PAT而言 : b 为 A , ac 均为 null ;
这就说明 a b c 三者 在{null, A ,A...A,....}中进行选择 是允许不一致的。
所以,找这里的 所有串 均是 : YES
}
划分 2.2: 针对 aPbATac
如果 aPbTc 满足 YES要求,即 xPATx ,则 aPbATac 必定满足,
若 aPbTc 满足 YES: b 必定 为'A', 而 a c 是什么 还不能够确定。
所以 aPbATac 可以化为 aPAATac 的形式,即 若满足aPbATac 是 YES 的情况,必定b是要为 'A'的。
<
若b 为 空, 则 aPbTc 为 aPTc 不正确, aPbATac 必定错
若b 为 A...A , 则 aPbTc 为 aPAA...ATc , 则aPbAA...ATac 也是错的。
>
所以,2.2 的判定条件 是 T 字符 位置与 P字符位置 相隔两个 字符
且该两个字符 均为 A ;然后再次在 这个基础上进行筛选。
so 2.2:T - P == 3 && X[P+1] == 'A' && X[P+2] == 'A'
{
2.2.1: b 为 'A', a c 应该均为 'A' 组成的子串,
ac 长度 >= a 即可 证明 ;
(因为:
1.a = c = null : a = ac =0
2. a != null c = null : a = ac
3. a != null c != null : a < ac
4. a = nul c != null : a < ac
)
同上面的表示法: a 子串的长度 = P 字符 在字符串 中出现的 位置
ac的长度 = 字符串最后字符 坐标(X_len-1)- T 在字符串中的 出现坐标 +1
2.2.1 :if P <= (X_len - T)
print : YES
2.2.2: NO
}
2.3: print NO
}
划分3: 出现多次 P T 的情况 都是不满足要求的
else
{
print : NO
}
}//划分 3
==============================================
SRC:
#include <stdio.h> #include <string.h> int main() { int P,T , P_count, T_count,X_len ,i ; int loop ; char X[102] ,c ; int pass ; scanf("%d", &loop) ; getchar() ; for ( i = 0 ; i < loop ; i++) { P = T = 0 ; P_count = T_count =0 ; X_len = 0 ; memset ( X , 0 , sizeof(X) ); while ( ~scanf ("%c", &c)) { if ( c == ' ' ) break ; switch(c) { case 'P': P_count++ ; P = X_len ; break ; case 'T': T = X_len ; T_count++ ; break ; case 'A': break ; default: pass = -1 ; break ; } X[X_len++] = c ; }//while if ( pass == -1 ) { printf("NO") ; } else if( P_count ==1 && T_count ==1 ) { if ( (T - P == 2) && X[P+1] == 'A' ) { printf("YES") ; } else if ( (T -P == 3) && (X[P+1]== 'A' && X[P+2]=='A')) { if (P <= (X_len - T) ) { printf("YES") ; } else { printf("NO") ; } } else { printf("NO") ; } } else { printf("NO") ; } } return 0 ; }
// not pass yet ╮(╯▽╰)╭或许是判断 接收字符串结束的 回车 在判题系统中 不适用