PAT初级1003我要通过(思考)

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原文链接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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值