#include#include int main(void) { //1.将字符串输入进数组 char c[10][101]; int i; int cnt; scanf_s("%d", &i); for (cnt = 0; cnt < i; cnt++) { scanf_s("%s", c[cnt], 101); } //2.计算PT数量 for (cnt = 0; cnt < i; cnt++) { int length = strlen(c[cnt]); int cntx = 0; int cnty = 0; int cntz = 0; int p = 0, t = 0; int jixu = 1; //用来串联每个环节 int p1 = 0, t1 = 0; //用来记录第一个PT的位置从而进入3环节 for (int cnt1 = 0; cnt1 < length; cnt1++) { if (c[cnt][cnt1] == 'P') { p++; p1 = cnt1; } if (c[cnt][cnt1] == 'T') { t++; t1 = cnt1; } } if (p == 1 && t == 1) { jixu = 1; } else jixu = 0; //printf("%dn", jixu); //printf("p1 = %d t1 = %d", p1, t1); //3.P要在T之前 if (jixu == 1) { if (p1 < t1) { jixu = 1; } else jixu = 0; } //printf("%dn",jixu); //4.PT中间必须有A if (jixu == 1) { jixu = 0; int j = p1; for (; j < t1; j++) { if (c[cnt][j] == 'A') { jixu = 1; break; } } } //printf("%dn", jixu); //5.检查左右两侧是否都是A if (jixu == 1) { for (int x = 0; x < p1; x++) { if (c[cnt][x] != 'A') { jixu = 0; break; } } for (int y = p1 + 1; y < t1; y++) { if (c[cnt][y] != 'A') { jixu = 0; break; } } for(int z = t1 + 1;z < length - 1;z++) { if (c[cnt][z] != 'A') { jixu = 0; break; } } } //6.计算 if (jixu == 1) { cntx = p1 - 0; cnty = t1 - p1 - 1; cntz = strlen(c[cnt]) - 1 - t1; if (cntx * cnty == cntz) { printf("YESn"); } else { printf("NOn"); } } if (jixu == 0) { printf("NOn"); } } return 0; }
思路:
1.首先把字符串输入进一个字符串数组
字符串数组一般用char类型的二维数组
第一个【】表示数组中的字符串数量 第二个【】表示每个字符串的最大长度(要把 算上)
运用for循环进行遍历 把输入的每个字符串都弄进scanf进数组——记得scanf字符串时要加上字符串大小,不然会报错 eg.scanf_s("%s",c[cnt],101)和scanf_s("%s",c,101)
2.计算每个字符串的PT数量
将每个字符串进行遍历 探索出来可以用c[cnt][cnt1] ——cnt是字符串在数组中的位置 cnt1是字符串中每个字符的位置
这样即可遍历字符串中的每个字符从而实现计数
3.确保P要在T前面
在2步骤中即锁定PT第一次出现的位置 然后即可比较坐标大小
4.确保PT之间要有A
两面包夹之势 锁定PT坐标从而确定A
5.PT两边和中间都是A
同4步骤
6.计算P前的A * PT之间的A == T之后的A
有了前面的铺垫就已经确保了PT两边和中间全都是A
因而在这一步可以直接利用坐标来计算A的数量



