1. 程式人生 > >PAT中文版1003.我要通過!

PAT中文版1003.我要通過!

答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於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
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' ),目的是防止把“==”寫成“=”,這種方式也算是一種程式設計規範吧。