PAT题目1003
个人代码(思路 C++):
include 《iostream》
include 《cstring》
using namespace std;
int main()
{
int flagP = 1;
int flagT = 1;
int flag = 0;
int P=0,T=0;
string s = “”;
int num = 0;
cin>>num;
while(cin>>s)
{
if(num>1)
{
while((s[0]‘A’||s[0]‘P’)&&s!="")
{
if(s[flag]‘P’&&flagT&&flagP)
{
flagP = 0;
P = flag;
}
else if(s[flag]‘P’&&flagT&&(!flagP))
{
cout<<“NO”<<endl;
break;
}
else if(s[flag]==‘P’&&(!flagT))
{
cout<<“NO”;
break;
}
else if(s[flag]‘T’&&flagT&&(!flagP))
{
flagT = 0;
T = flag;
}
else if(s[flag]‘T’&&flagT&&flagP)
{
cout<<“NO”<<endl;
break;
}
else if(s[flag]‘T’&&(!flagT)&&(!flagP))
{
cout<<“NO”<<endl;
break;
}
else if(s[flag]’\0’&&((T-P-1)==0))
{
cout<<“NO”<<endl;
break;
}
else if(s[flag]’\0’&&((T-P-1)*P!=(flag-T-1)))
{
cout<<“NO”<<endl;
break;
}
else if(s[flag]’\0’)
{
cout<<“YES”<<endl;
break;
}
flag++;
}
if(!flag)
{
cout<<“NO”<<endl;
}
}
else
{
while((s[0]‘A’||s[0]‘P’)&&s!="")
{
if(s[flag]‘P’&&flagT&&flagP)
{
flagP = 0;
P = flag;
}
else if(s[flag]‘P’&&flagT&&(!flagP))
{
cout<<“NO”;
break;
}
else if(s[flag]‘P’&&(!flagT))
{
cout<<“NO”;
break;
}
else if(s[flag]‘T’&&flagT&&(!flagP))
{
flagT = 0;
T = flag;
}
else if(s[flag]‘T’&&flagT&&flagP)
{
cout<<“NO”;
break;
}
else if(s[flag]‘T’&&(!flagT)&&(!flagP))
{
cout<<“NO”;
break;
}
else if(s[flag]’\0’&&((T-P-1)0))
{
cout<<“NO”;
break;
}
else if(s[flag]’\0’&&((T-P-1)*P!=(flag-T-1)))
{
cout<<“NO”;
break;
}
else if(s[flag]’\0’)
{
cout<<“YES”;
break;
}
flag++;
}
if(!flag)
{
cout<<“NO”;
}
}
flagP = 1;
flagT = 1;
P = 0;
flag = 0;
s = “”;
num–;
}
return 0;
}
此代码质量较差,仅实现功能(因为没时间,不想改(:了)
加粗部分可转为函数,传参,以函数调用方式减少代码冗余
PLUS:
加粗的代码部分前一大半其实为另一个题目(类似于编译原理,xxPxxTxx)*
后一部分P、T前后‘A’数量比较才为本题解题思路
所以理解题意很重要!!!
本题解题思路:
1、获取P和T的位置下标
2、对比P前、P和T之间、T之后的‘A’数量
case1:P前和T后‘A’为0,且P和T间A的个数大于0,输出YES;
case2:P前‘A’个数*P和T间‘A’个数=T后‘A’个数,输出YES
3、善用信号量flag
补充知识
(本人写代码时突然分不清的知识点)
原文链接https://blog.csdn.net/sinat_34089391/article/details/80292377
**
PLUS
其它解决方案(搬运)
**
1:
https://blog.csdn.net/weixin_45433525/article/details/104665089
2:
https://www.cnblogs.com/ittinybird/p/4531758.html
… …