/**********************3stone***************************
Problem: PAT.B1003. 我要通过 (20)
Author:3stone
Time:2017/3/7
思路:
1、条件1直接匹配即可
2、分别记录P左边,PT中间,T右边的A的数量
3、按照条件3逆推,看是否能达到条件2所要求的
注意:【有一个测试点过不了】
***********************3stone***************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxSize 10010
using namespace std;
int check(char str[]){
char tar[5] = {'P', 'A', 'T'};
if(0 == strcmp(str, tar)) return 1;
//蜕去外衣
int len = strlen(str);
int left = 0, middle = 0, right = 0, flag = 0;
int p_f = 0, t_f = 0;
for(int i = 0; i < len; i++) {//记录 左 中 右 A的个数
if('A' == str[i]){
if(0 == flag) left++;
if(1 == flag) middle++;
if(2 == flag) right++;
}
else if('P' == str[i]){
if(1 == p_f) return 0;//P 只能出现一次
flag = 1;
p_f = 1;
continue;
}
else if('T' == str[i]){
if(1 == t_f) return 0;
flag = 2;
t_f = 1;
continue;
}
else //含有其他字符
return 0;
}
// printf("A: %d %d %d\n",left, middle, right);
//循环检查;逆推,看能不能得到条件2要求的字符
int key = 0;
while(middle >= 1 && left >= 0 && right >= 0){
if(1 == middle && left == right){
key = 1;
break;
}
else{
middle--;
right -= left;
}
}
if(0 == key) return 0;
else return 1;
}
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
char str[110];
scanf("%s", str);
int re = check(str);
if(0 == re) printf("NO\n");
else printf("YES\n");
}
return 0;
}
数学问题--PAT.B1003. 我要通过
最新推荐文章于 2023-01-10 20:35:03 发布