PAT中文版1003.我要通過!
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於PAT的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
1. 字串中必須僅有P, A, T這三種字元,不可以包含其它字元;
2. 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串;
3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a, b, c 均或者是空字串,或者是僅由字母 A 組成的字串。
輸入格式:
輸出格式:每個字串的檢測結果佔一行,如果該字串可以獲得“答案正確”,則輸出YES,否則輸出NO。
輸入樣例:8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA輸出樣例:
YES YES YES YES NO NO NO
NO
ps:題目很簡單,但是理解上出現了問題,關鍵在於第二個條件中xPATx,做題時候把左右兩個x看做可以是不同的,提交了很多次,後來和大家討論了一下,發現之前想錯了。第一個條件的檢查很簡單,第二個條件說明PAT左右可以有任意A但是必須是數量相同的,第三那個條件說明每當中間增加一個A,那麼右面增加和左面數量相同的A,結合第二個條件,進一步說明PAT右面的A的數量是左面A數量的整數倍,所以有了下面的程式。
#include<stdio.h> #include<string.h>
#define N 10000
char inStr[N]; int len;
bool checkA(int begin,int end) { for(int i=begin;i<end;i++) if( 'A'!=inStr[i] ) return false; return true; }
bool check() { int i,posP,posT; for(i=0;i<len;i++) { if( 'P'==inStr[i] ) posP=i; if( 'T'==inStr[i] ) posT=i; } if( checkA(0,posP) && checkA(posP+1,posT) && checkA(posT+1,len) && posT-posP>1 && (posT-posP-1)*(posP)==len-posT-1 ) return true; return false; }
bool checkOne() { for(int i=0;i<len;i++) if( !('P'==inStr[i] || 'A'==inStr[i] || 'T'==inStr[i]) ) return false; return true; }
int main() { int nCases; scanf("%d",&nCases); while( nCases-- ) { scanf("%s",inStr); len=strlen(inStr); printf("%s\n",(checkOne() && check())?"YES":"NO"); }
return 0; }
需要注意的是,在進行if條件比較時候的方式,比如,寫作if( 'A'==inStr[i] ),而不寫成if( inStr[i]=='A' ),目的是防止把“==”寫成“=”,這種方式也算是一種程式設計規範吧。