1. 程式人生 > >PTA乙級刷題日誌---1003(20分)我要通過

PTA乙級刷題日誌---1003(20分)我要通過

答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”

得到“答案正確”的條件是:

  1. 字串中必須僅有 P、 A、 T這三種字元,不可以包含其它字元;
  2. 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串
  3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a、 b、 c 均或者是空字串,或者是僅由字母 A 組成的字串。

現在就請你為 PAT 寫一個自動裁判程式,判定哪些字串是可以獲得“答案正確”的。

輸入格式:

每個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (<10),是需要檢測

 

的字串個數。接下來每個字串佔一行,字串長度不超過 100,且不包含空格。

輸出格式:

每個字串的檢測結果佔一行,如果該字串可以獲得“答案正確”,則輸出 YES,否則輸出 NO。

輸入樣例:

8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA

輸出樣例:

YES

YES

YES

YES

NO

NO

NO

NO


思路:

  • (看到這題字數多有點慌)
  • 用二維陣列儲存字串,迴圈判斷
  • 主要是條件三不會理解。意思就是形如aPbTc, PT之間每多一個字母A,PT後就要就多一倍PT前的字元。歸納來說就是中間的字母數inner乘以前面的字元數before等於後面的字元數after。其實條件三滿足了,條件二也就滿足了。
  • 那麼不滿足條件的情況有:
    • 只含有PAT三個其中一個或者兩個的
    • 含有除PAT外別的字元的
    • P和T位置不對的(T在P前面)
    • after!=inner*before

 

參考:http://https://blog.csdn.net/zxm490484080/article/details/52832202


 

 程式碼:

#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; i++)
	{
		if(a[i]==1)printf("YES\n");
		else printf("NO\n");
	}
// 	if(a[n-1]==1)printf("YES");
// 	else printf("NO");
	return 0;
}

打卡:2018.10.16(2/5)