您的位置:首页 > 其它

pat(basic level) 1003

2014-04-15 23:37 148 查看
题目: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的的值

另外做题时要先分析清楚逻辑关系,不然容易逻辑混乱并且很浪费时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: