PTA乙級刷題日誌---1003(20分)我要通過
阿新 • • 發佈:2018-11-11
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
- 字串中必須僅有 P、 A、 T這三種字元,不可以包含其它字元;
- 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串;
- 如果 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;
}