题目:http://pat.zju.edu.cn/contests/pat-b-practise/1003
题目大意:只能出现P ,A, T字符,
如果形如 --PAT--则P前面的A和T后面的T的个数相同
如果形如 aPbTc则P前面A的个数a ,PT之间的A的个数b和T后面的A的个数c 满足关系:a*b=c
另外要注意P一定要在T的前面
下面写的代码很粗糙 有时间在优化一下
#include<iostream>
using namespace std;
int main ()////不能用void main()?
{
int n,i,f_p,f_t;
char a[104];
while(cin>>n)
{
while(n)
{
n--;
cin>>a;
int flag1[4]={0},flag3=0;//每次循环初始化
int flag2[4]={0};f_p=f_t=0;
// cout<<a<<endl;////////
for(i=0;a[i]!='\0';i++)//for 是i++还是++i?;
{
if(a[i]=='P')
{
flag1[1]=1,flag2[1]++;f_p=i;
if(i-flag2[2]!=0){flag2[0]=-1;break;}
}
if(a[i]=='A') flag1[2]=1,flag2[2]++;
if(a[i]=='T')
{
flag1[3]=1,flag2[3]++;f_t=i;
if(i-flag2[1]-flag2[2]!=0){flag2[0]=-1;break;}
}
}//if(f_p*f_t!=i-f_t) flag3=-1;
if(f_t-f_p==2)
{
if(f_p!=i-f_t-1) flag3=-1;
}
if(f_t-f_p>2)
{
if(f_p*(f_t-f_p-1)!=i-f_t-1) flag3=-1;
}
if(f_t<f_p||f_t-f_p==1) flag3=-1;
if(flag2[1]!=1||flag2[3]!=1){flag2[0]=-1;}
if(flag2[0]==-1||flag1[0]==-1||flag3==-1)
cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
return 0;
}
总结:
主函数用int main()
for(;;i++)在每次循环末尾改变i后与条件比较 ,注意跳出循环后i的的值
另外做题时要先分析清楚逻辑关系,不然容易逻辑混乱并且很浪费时间