1003 我要通过!(C和C++版本)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main(void) 6 { 7 char a[10][100];//用二维数组来表示 ,10表示不超过十个自然数,100存储长度不超过100的字符串 8 int n, k, m, j = -1, t = -1, h = -1, x = 0, y = 0, z = 0;//定义一些变量 9 scanf("%d", &n);//输入自然数个数限定 10 for (k = 0; k<n; ++k)//循环输入自然数 11 { 12 scanf("%s", a[k]); 13 } 14 for (k = 0; k<n; ++k, x = 0, y = 0, z = 0, j = -1, t = -1)/*这里重要,后面的定义是以大局观来讲的。首先对k循环,遍历数组。定义x,y,z表示下面符合要求的个数(分别求出字符A,在P前数量 15 在P与T之间数量,T之后数量,定义j,t实际相当于做一个标识,表示,字符串遍历到的位置为P,T*/ 16 { 17 if (strchr(a[k], 'P') != NULL && strchr(a[k], 'A') != NULL && strchr(a[k], 'T') != NULL)//(strchr检测字符串中是否包含此字符), 此式检测字符串中是否含有P,A,T字符 18 { 19 for (m = 0; a[k][m] != '\0'; m++)//k用来遍历数组,m进入数组,遍历数组内容,对数组内容进行检测 20 { 21 if (a[k][m] != 'P'&&a[k][m] != 'A'&&a[k][m] != 'T')//这个是对要求1的检测 22 { 23 printf("NO\n"); 24 break; 25 } 26 if (a[k][m] == 'P')//遇到P时,标识,进入下一个字符 27 { 28 j = m; 29 continue; 30 } 31 if (a[k][m] == 'T')//与上面P类似 32 { 33 t = m; 34 continue; 35 } 36 if (a[k][m] == 'A')//... ... 37 { 38 if (j == -1 && t == -1)//检测当j,t都为原值时,表明未遇到P,此时计算P前字符A的数量 39 { 40 ++x; 41 } 42 if (j != -1 && t == -1)//检测,当j不为原值,t为原值,表明遇到P未遇到t,计算字符P,T之间的字符A的数量 43 { 44 ++y; 45 } 46 if (j != -1 && t != -1)//计算T之后字符A的数量 47 { 48 ++z; 49 } 50 } 51 52 } 53 } 54 else 55 { 56 printf("NO\n");// 不满足条件1,打出NO 57 } 58 if (x*y == z && y != 0)//检测字符A的数量是否满足关系,且P,T之间,字符A的数量不能为0 59 printf("YES\n"); 60 else//A不满足数量关系 61 { 62 if (j != -1 || t != -1)//表示是检测完字符串的,j,t改变 63 { 64 printf("NO\n"); 65 } 66 } 67 } 68 system("PAUSE"); 69 return 0; 70 }
还是借鉴别人的提示,知道了后面一句的意思。要实现的是,使在字符P之前的A数量*P,T之间A的数量=T后面A的数量
这PAT提示的错误不知道哪里错了,看到很无奈,输入输出明明和它一样.=.=.....


2018-03-14 18:11
补充:发现一个问题,这道题PAT满足条件,那TAP也是应该满足条件的,我查了网上其他人用C和C++完成且通过这道题的人的代码,发现PAT是yes,TAP是NO,不知道是不是这道题的缺陷。
2018-03-14 18:11
补充:以为是''\n''是不是最后一个不能有,于是加上了一个判断语句。
for... { w=n; ... if(w!=n-1) { printf("\n"); } ...
形式是这样的,还是错了,还是那个点....
2018-09-18 22:03
今天试一次通过,之前的作为记录不删掉:
还是理清楚思路:
1.先看要求,总结一下,
a.只能有'P','A','T'
b.条件二:AAPATAA,PAT都满足,条件三,刚开始看没思路,可以这样理解,由aPbTc-->aPbATca,之间由于b增加了一个‘A’,c就增加了一个a,可以列出关系式:a中的‘A’个数 *(b中‘A’的数量+'P' 'T'之间‘A’的数量) = c中‘A’的数量
+ 'P' 'T'之间‘A’的数量*a中的‘A’个数化简之后就是,a中的‘A’个数 * b中‘A’的数量 = c中‘A’的数量
C++版本:
#include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning(disable:4996) int main(void) { int n, pos[3] = { 0 }, num[3] = { 0 }, tf[3] = { 0 }; char str[102] = { 0 }; scanf("%d", &n); while (n--) { scanf("%s", &str); tf[0] = tf[1] = tf[2] = 0; pos[0] = pos[1] = pos[2] = 0; num[0] = num[1] = num[2] = 0; for (size_t i = 0; i < strlen(str); ++i) { if (str[i] == 'P') { ++tf[0]; pos[0] = i; } if (str[i] == 'T') { ++tf[1]; pos[1] = i; } if (str[i] == 'A') { ++tf[2]; } if (str[i] != 'P' && str[i] != 'A' && str[i] != 'T') { tf[0] = 666; break; } } if (tf[0] != 1 || tf[1] != 1 || tf[2] == 0) { printf("NO\n"); continue; } for (int k = 0; k < strlen(str); ++k) { if (k < pos[0]) if (str[k] == 'A') ++num[0]; if (k > pos[0] && k < pos[1]) if (str[k] == 'A') ++num[1]; if (k > pos[1]) if (str[k] == 'A') ++num[2]; } if (num[2] == num[0] * num[1]) { printf("YES\n"); continue; } else{ printf("NO\n"); continue; } } return 0; }
#include <bits/stdc++.h> #include <string.h> using namespace std; int main() { int n, pos[3] = { 0 }, num[3] = { 0 }, tf[3] = { 0 }; string s; cin >> n; while (n--) { cin >> s; tf[0] = tf[1] = tf[2] = 0; pos[0] = pos[1] = pos[2] = 0; num[0] = num[1] = num[2] = 0; for (size_t i = 0; i < s.size(); ++i) { if (s[i] == 'P') { ++tf[0]; pos[0] = i; } if (s[i] == 'T') { ++tf[1]; pos[1] = i; } if (s[i] == 'A') { ++tf[2]; } if (s[i] != 'P' && s[i] != 'A' && s[i] != 'T') { tf[0] = 666; break; } } if (tf[0] != 1 || tf[1] != 1 || tf[2] == 0) { cout << "NO" << endl; continue; } for (int k = 0; k < s.size(); ++k) { if (k < pos[0]) if (s[k] == 'A') ++num[0]; if (k > pos[0] && k < pos[1]) if (s[k] == 'A') ++num[1]; if (k > pos[1]) if (s[k] == 'A') ++num[2]; } if (num[2] == num[0] * num[1]) { cout << "YES" << endl; continue; } else{ cout << "NO" << endl; continue; } } return 0; }
C语言版本:

浙公网安备 33010602011771号