1. 程式人生 > >PAT (乙等) Practice |(1003) --附strlen()函式用法 C++

PAT (乙等) Practice |(1003) --附strlen()函式用法 C++

題目描述:

1003 我要通過! (20 分)

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

分析:

該題目條件三的意思是:字串必須滿足“P之前A的數量*P與T之間A的數量=T之後A的數量”。

我的程式進行三次判斷:

1、第一次判斷,判斷字串是否只含有‘P’、‘A’、‘T’、‘\0’,且'P'、’T‘只有一個且肯定含有'A'。

2、第二次判斷,判斷字串中’P'是否在‘T’之前。

3、第三次判斷,判斷字串是否滿足條件三,即字串是否滿足“P之前A的數量*P與T之間A的數量=T之後A的數量”。


結果‘:

提交時間 狀態 分數 題目 編譯器 耗時 使用者
2019/1/13 13:23:34

答案正確

20 1003 C++ (g++) 4 ms 方人也幾點
測試點 結果 耗時 記憶體
0 答案正確 4 ms 380 KB
1 答案正確 4 ms 348 KB
2 答案正確 4 ms 368 KB
3 答案正確 4 ms 384 KB
4 答案正確 4 ms 384 KB
5 答案正確 4 ms 384 KB

程式碼:

#include<iostream>
#include<string.h>
using namespace std;

bool judge_step1(char s[]){//初步判斷是否滿足條件1、2
    int couter_P = 0,couter_T = 0,couter_A = 0;
    for(int i=0;i<strlen(s);i++){
        if(s[i]!='P' && s[i]!='A' && s[i]!= 'T' && s[i]!='\0')
            return 0;
        else{
            if(s[i] == 'P'){
                couter_P++;
                if(couter_P == 2) return 0;
            }
            if(s[i] == 'T'){
                couter_T++;
                if(couter_T == 2) return 0;
            }
            if(s[i] == 'A') couter_A++;
        }
    }
    if(couter_A == 0) return 0;
    return 1;
}

bool judge_step2(char s[]){//判斷P是否在T之前
    int p = 0;
    for(int i=0;i<strlen(s);i++){
        if(s[i] == 'T'){
            if(p == 0) return 0;
            else return 1;
        }
        if(s[i] == 'P') p = 1;
    }
}

bool judge_step3(char s[]){//判斷是否滿足條件3
    int couter_A_before=0,couter_A_inner=0,couter_A_after=0;
    int i = 0;
    while(s[i] != 'P'){couter_A_before++;i++;}i++;
    while(s[i] != 'T'){couter_A_inner++;i++;} i++;
    while(s[i] != '\0'){couter_A_after++;i++;}
    if(couter_A_before*couter_A_inner == couter_A_after) return 1;
    else return 0;
}

int main(){
    int n,i,result_Judge1,result_Judge2,result_Judge3,result;
    char s[101];//字元陣列
    int jud[10];//用於儲存判定結果,陣列元素為0(表示回答錯誤);為1(表示回答正確)
    cin>>n;//正整數 n (<10),是檢測的字串個數

    for(i=0;i<n;i++){
        cin>>s;
        result_Judge1 = judge_step1(s);//result_Judge為0或1
        if(result_Judge1 == 1){//第一步判斷正確
            result_Judge2 = judge_step2(s);
            if(result_Judge2 == 1){//第二步判斷正確
                result_Judge3 = judge_step3(s);
                if(result_Judge3 == 1) result = 1;//第三步判斷正確
                else result = 0;
            }
            else result =0;
        }
        else result = 0;

        jud[i] = result;//把result_Judge結果存放在判斷數組裡
    }

    /*輸出*/
    for(i=0;i<n;i++){
        if(jud[i] == 1) cout<<"YES"<<endl;//元素為1->回答正確
        else cout<<"NO"<<endl;//元素為0->回答錯誤
    }

    return 0;
}


附:

strlen()的用法:

標頭檔案:#include<string.h>

作用:檢索字串,直到遇到'\0',然後計算字串的長度。