PAT 乙級1003 我要通過
阿新 • • 發佈:2019-02-10
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; }