• [C++]PAT乙级1003. 我要通过!(17/20)


    /*
    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
    
    */
    /*
        思路:
            方法1:规则制约法
                    复杂度:O(n)
            方法2:递归
                    O(n^2)
    */
    #include<stdio.h>
    #include <string.h>
    using namespace std;
    
    const int MAX_LENGTH = 100;
    
    //判断是否满足条件1:1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
    bool isPATChars(char chs[], int len){
        for(int i=0;i<len;i++){
            if(chs[i] != 'P' && chs[i] != 'A' && chs[i] != 'T')
                return 0;
        }
        return 1;
    }
    
    bool isPAT(char chs[], int len){
        if(len < 3)
            return false;
        int p_flag=-1;//标记P位置
        int t_flag=-1;//标记T位置
        int a_count=0; //统计中间a的个数:若中间a的个数为1-2个,正确;反之,不正确
        for(int i=0;i<len;i++){
            if(chs[i] == 'A'){
                if(p_flag != -1){
                    if(t_flag == -1){
                        a_count++;
                    }
                }
            } else if(chs[i] == 'P'){
                if(p_flag == -1){//说明:找到第1个字符'P'
                    p_flag = i;
                } else {//说明有超过1个字符'P'了
                    return false;
                }
    
            } else {//当前元素为 'T'
                if(t_flag == -1){//说明:找到第1个字符'T'
                    if(p_flag == -1){ //说明: 此时出现的'T'比'P'先出现,错误情况
                        return false;
                    }
                    t_flag = i; //出现的第一个在'P'后面的 ‘T’
                } else {//说明有超过1个字符'T'了
                    return false;
                }
    
                if(p_flag != -1){//说明:'P'在'T'之前出现了,正确情况
                    if(p_flag == i - 1){ //说明:'P'与'T'紧贴着,中间没有'A' 错误情况
                        return false;
                    }
                } else {//说明:'P'在'T'之前出现了,错误情况
                    return false;
                }
            }
        }
    
        if(p_flag == -1 || t_flag == -1 || a_count>2 || a_count<1)//保证PAT均有出现
            return false;
        return true;
    }
    
    int main(){
        int size;
        char chs_arr[10][MAX_LENGTH];
    
        scanf("%d", &size);
    
        for(int i=0;i<size;i++){
            scanf("%s", (chs_arr+i));
        }
    
        for(int i=0;i<size;i++){
            //scanf("%s", (chs_arr+i));
            //printf("%d", strlen(chs_arr[i]));
            if(isPATChars(chs_arr[i], strlen(chs_arr[i]))){
                if(isPAT(chs_arr[i], strlen(chs_arr[i]))){
                    printf("YES
    ");
                } else {
                    printf("NO
    ");
                }
            } else {
                printf("NO
    ");
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    kubeadm部署k8s v1.18.6版本
    harbor
    kubectl常用命令
    日常运维知识点
    CentOS6.5搭建oracle11g RAC
    linux(mint)下刻录镜像到光盘
    aspectj
    NoSql系列目录
    在线考试系统源码(题库抽题&自动阅卷打分)
    java问卷调查系统源码(java+mysql)
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/8799221.html
Copyright © 2020-2023  润新知