1003 我要通過! (20分) C/C++

原題網址:https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192

 

答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 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

思路:

條件2和3一組合,其實是一道數學題,就是(P前面的A的數目)*(P和T之間A的個數)=(T之後的A的格式),當然前提是字符串有且只有一個P和T。

#include<stdio.h>
#include<string.h>

bool judge(char *p)
{
    int chang=strlen(p);
    int x,y,z;  //x是P前面的字符的個數,y是P和T之間字符的個數,z是T之後字符的個數
    int countp,counta,countt;// 用於統計字符串中P、A、T的個數
    x=y=z=0;
    countp=counta=countt=0;
    
    //找P
    for(int i=0;i<chang;i++)
    {
        if(p[i]=='P')
        {
            x=i;
            countp++;
        }
    }
    //找A
    for(int i=0;i<chang;i++)
    {
        if(p[i]=='A')  counta++;
    }
    
    //找T
    for(int i=0;i<chang;i++)
    {
        if(p[i]=='T')
        {
            y=i-x-1;
            countt++;
        }
    }
       z=chang-x-y-2;
    if(counta==0) return false;
    if(countp!=1||countt!=1) return false;
    if((countp+counta+countt)!=chang) return false;
    if(x*y!=z)  return false;
    return true;
}



int main()
{
    //輸入數據
    int n;
    scanf("%d",&n);
    char s[101];
    // 依次判斷
    for(int i=0;i<n;i++)
    {
        scanf("%s",&s);
        if(judge(s))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章