1. 程式人生 > >PAT B1003 我要通過!

PAT B1003 我要通過!

algo 使用 spa aaa main out system 做了 空字符串

答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬於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
#include <stdio.h>
#include <algorithm>
#include 
<string> #include <map> #include <iostream> #include <stack> using namespace std; int main(){ char s[101]; int n; scanf("%d\n", &n); for (int i = 0; i < n; i++){ char c = getchar(); int pos = 0, flag = 0, flag_a = 0; int p_num = 0, t_num = 0
; int a_pre = 0, a_mid = 0, a_end = 0; while (c != \n){ s[pos++] = c; if (flag==0 && (c == P || c == A || c == T)){ if (flag_a == 0 && c == A){ a_pre++; } else if (flag_a == 1 && c == A){ a_mid++; } else if (flag_a == 2 && c == A){ a_end++; } else if (c == P && p_num == 0 && flag_a == 0){ p_num++; flag_a++; } else if (c == T && t_num == 0 && flag_a == 1){ t_num++; flag_a++; } else{ flag = 1; } } else{ flag = 1; } c = getchar(); } //cout << flag << a_pre << a_mid << a_end<<endl; if (flag == 0 && p_num==1 && t_num==1){ if (a_end == a_pre * a_mid && a_mid>0)printf("YES\n"); else printf("NO\n"); } else printf("NO\n"); } system("pause"); }

一開始不知道該怎麽做,感覺要用叠代,但發現叠代式和叠代邊界都不好定義,主要是叠代邊界有點混亂,後來發現有規律,前面的A的個數*中間A的個數==後面A的個數。發現了這個規律後就好做了,但提交有個點一直錯誤,後來發現是忘記判定P和T有沒有出現過了。

註意點:除了滿足上面那個條件,還要滿足P和T都只出現了一次,並且P在T前面,中間一定要有A,讀字符使用了getchar,每輸入一個字符就獲得他。

PAT B1003 我要通過!