1003(20分)我要通過
阿新 • • 發佈:2018-12-16
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 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
程式碼:
#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; }