1. 程式人生 > >PAT 我要通過 C++實現

PAT 我要通過 C++實現

題目內容:

答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。

得到“答案正確”的條件是:

  1. 字串中必須僅有 PAT這三種字元,不可以包含其它字元;
  2. 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串;
  3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 abc 均或者是空字串,或者是僅由字母 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]);
    }//對所有字串做出判斷
}