PAT 我要通過 C++實現
題目內容:
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
- 字串中必須僅有
P
、A
、T
這三種字元,不可以包含其它字元; - 任意形如
xPATx
的字串都可以獲得“答案正確”,其中x
或者是空字串,或者是僅由字母A
組成的字串; - 如果
aPbTc
是正確的,那麼aPbATca
也是正確的,其中a
、b
、c
均或者是空字串,或者是僅由字母A
組成的字串。
現在就請你為 PAT 寫一個自動裁判程式,判定哪些字串是可以獲得“答案正確
我的解題思路:
首先從條件1中我們知道字串中只能夠包含P,A,T三種字元,
再看條件2,滿足條件的前提是P和T之間必須有一個A,且P前面的和T後面的A的個數必須一樣,也可以沒有A。
條件3前提是如果aPbTc正確,(要想aPbTc正確,由條件2知道:a=c,b是A。)aPbATca也正確,即aPAATaa(把b換成A,c換成a)也正確,所以正確的前提是P前面的A的個數和P與T之間的A的個數的積等於T後面的A的個數。
#include<iostream>
#include<string>
using namespace std;
void isRight(string a) {
int countp=0, countt=0;//p和t的個數
int Lp, Lt;//p和t的位置
for (int i = 0; i < int(a.size()); i++) {
if (a[i] != 'P' && a[i] != 'T' && a[i] != 'A') {
cout << "NO"<<"\n";
return;
}//此處要求字串中只包含P和T
if (a[i] == 'P') {
Lp = i;
countp++;
}//找到P的位置和P的個數
if (a[i] == 'T') {
Lt = i;
countt++;
}//找到T的位置和T的個數
}
if ((Lt - 1 - Lp) >= 1 && Lp*(Lt - Lp - 1) == (int(a.size()) - Lt - 1) && countp == 1 && countt == 1 )
//此處要求滿足P前面的A的個數和P與T之間的A的個數相乘的積等於T後面的A的個數,也要求T在P後面,而且要包含一個T和一個P;
cout << "YES"<< "\n";
else
cout << "NO"<< "\n";
}
int main() {
int n;
string A[20] ;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> A[i];
}//輸入字串
for (int i = 0; i < n; i++) {
isRight(A[i]);
}//對所有字串做出判斷
}