PAT (乙等) Practice |(1003) --附strlen()函式用法 C++
阿新 • • 發佈:2019-01-13
題目描述:
1003 我要通過! (20 分)
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
- 字串中必須僅有
P
、A
、T
這三種字元,不可以包含其它字元; - 任意形如
xPATx
的字串都可以獲得“答案正確”,其中x
或者是空字串,或者是僅由字母A
組成的字串; - 如果
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',然後計算字串的長度。