1. 程式人生 > >PAT 乙級1003 我要通過

PAT 乙級1003 我要通過

1003. 我要通過!(20)時間限制400 ms記憶體限制65536 kB程式碼長度限制8000 B判題程式Standard作者CHEN, Yue“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於PAT的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。得到“答案正確”的條件是:1. 字串中必須僅有P, A, T這三種字元,不可以包含其它字元;2. 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串;3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a, b, c 均或者是空字串,或者是僅由字母 A 組成的字串。
現在就請你為PAT寫一個自動裁判程式,判定哪些字串是可以獲得“答案正確”的。輸入格式: 每個測試輸入包含1個測試用例。第1行給出一個自然數n (<10),是需要檢測的字串個數。接下來每個字串佔一行,字串長度不超過100,且不包含空格。輸出格式:每個字串的檢測結果佔一行,如果該字串可以獲得“答案正確”,則輸出YES,否則輸出NO。輸入樣例:8PATPAATAAPATAAAAPAATAAAAxPATxPTWhateverAPAAATAA輸出樣例:YESYESYESYESNONONONO題目的三條規則中只有第三條意思比較難懂,其實就是在形如aPbTc的字串中,P和T中間每多一個字母A,T後就要多一個字串a,字串abc都是僅由A組成的,或者是空字串。
總結起來其實就是 字串為“PAT”及其衍生的一系列的,而衍生的字串符合的規則一定是 P之前的A的數量(稱為before)乘以PT之間的A的數量(稱為inner)等於T之後的A的數量(稱為after),即after=before*inner;例如:PAT before = 0 inner = 1 after = 0 0=1*0APATA before = 1 inner = 1 after = 1 1=1*1所以不符合題意的有:1、只含有PAT三個其中一個或者兩個的;2、含有除PAT外別的字元的3、P和T位置不對的(T在P前面)4、after!=inner*before程式碼如下:
#include <stdio.h>

int main(){
	int n;
	char q[10][100];
	int before= 0,inner= 0,after= 0;//分別存放三處A的數量 
	int P = 0,T = 0;//存P和T的數量,同時作為PT是否出現的標誌 
	int i,j;
	int a[10];//分別存放各個字串的狀態 1為正確 其他均為錯誤 
	scanf("%d",&n);
	for(i = 0; i < n; i++){
		a[i] = 0;
	}
	for(i = 0; i < n; i++){
		scanf("%s",&q[i]);
	}
	for(i = 0; i < n; i++){
		//迴圈之前初始化這些變數 
		before = 0; 
		after = 0;
		inner = 0;
		P = 0;
		T = 0;
		for(j = 0; q[i][j]!='\0'; j++){
			
			//字串中有其他字母 
			if(q[i][j] != 'P'&& q[i][j] != 'A'&& q[i][j] != 'T')
				a[i] = -1;
			//分別計算P和T的數量 並判斷P和T的位置 
			else if(q[i][j] == 'P' && T == 0)P++;//T此時為0 保證P是在T前面 
			else if(q[i][j] == 'T' && P == 1)T++;
			//分別計算三處A的數量
			else if(q[i][j] == 'A')
			{
			if(P == 0 && T == 0)
				before++;
			else if(P == 1 && T == 0)
				inner++;
			else if(T == 1 && P == 1)
				after++;
			}
				
		}
		//排除有其他字母的情況 
		if(a[i]==0){
		if(j < 3)a[i] = 0;//如果只含兩個字母 那麼說明一定沒有PAT 
		else if(T != 1||P != 1)a[i] = 0;//P和T數量不對 或者位置不對 
		else if(after == before * inner)a[i] = 1; 
		}
	}
	for(i = 0; i < n-1; i++)
	{
		if(a[i]==1)printf("YES\n");
		else printf("NO\n");
	}
	if(a[n-1]==1)printf("YES");
	else printf("NO");
	return 0;
}