RIXO 发表于 2019-2-26 18:34: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

帖子答案代码(不一定正确)
#include<iostream>
#include<string.h>
using namespace std;


int main(){
        int n,cout_p,cout_a,cout_t,pos_p,pos_t;
        char a;
        int b;
        cin>>n;               # cin是什么东西,这个语句什么意思
        for(int i=0;i<n;++i){
                cin>>a;
                cout_p=cout_a=cout_t=pos_p=pos_t=0;
                int c=strlen(a);
                for(int j=0;j<c;++j)
                {
                        if(a=='A')
                                cout_a++;
                        if(a=='P'){
                                cout_p++;
                                pos_p=j;
                        }       
                        if(a=='T'){
                                cout_t++;
                                pos_t=j;
                        }
                }
               
                if(cout_a+cout_p+cout_t!=strlen(a) || cout_p>1 ||cout_t>1 || pos_p+1>=pos_t || pos_p*(pos_t-pos_p-1)!=strlen(a)-pos_t-1)         // 这里是用来干什么的
                        b=0;
                else b=1;
        }
        for(int i=0;i<n;++i){
                if(b==0) cout<<"NO"<<endl;
                else cout<<"YES"<<endl;
        }

人造人 发表于 2019-2-26 21:37:57

先去学C++,之后再解决这个问题

RIXO 发表于 2019-2-27 09:08:06

人造人 发表于 2019-2-26 21:37
先去学C++,之后再解决这个问题

用c,对这题有什么好的解决办法吗?

人造人 发表于 2019-2-27 23:13:56

你能解释一下最后一个为什么是NO吗?


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

bool is_yes(char *buff)
{
        bool flag = false;
        bool a_flag = false;
        for(int i = 0; buff; ++i)
        {
                switch(buff)
                {
                case 'P':
                case 'p':
                        for(int j = i + 1; buff; ++j)
                        {
                                if(buff == 'A' || buff == 'a')
                                {
                                        a_flag = true;
                                        continue;
                                }
                                if(a_flag && (buff == 'T' || buff == 't'))
                                        flag = true;
                        }
                case 'A':
                case 'a':
                case 'T':
                case 't':
                        break;
                default:
                        return false;
                }
        }
        if(flag)
                return true;
        return false;
}

int main(void)
{
        int count;
        scanf("%d", &count);
        getchar();
        char (*buff) = malloc(1024 * count);
        for(int i = 0; i < count; ++i)
        {
                fgets(buff, 1024, stdin);
                buff) - 1] = '\0';
        }

        for(int i = 0; i < count; ++i)
        {
                printf("%s\n", is_yes(buff) == true ? "YES" : "NO");
        }
        free(buff);
        return 0;
}

RIXO 发表于 2019-2-28 08:51:17

人造人 发表于 2019-2-27 23:13
你能解释一下最后一个为什么是NO吗?

他的意思应该是       aPbATc      或者   aPbTc      最后一个是APAAATC      两个A了就不行

行客 发表于 2019-2-28 11:35:15

试下代码,看看满分没。代码应该很容易看懂:
#include <cstdio>
#include <cstring>
int main()
{
    intt;
    scanf("%d\n",&t);
    char c;
    while(t --)
    {
      int l=0;
      int flag=0;
      int locat;
      scanf("%s",c);
      int a;
      for( a = 0; a < strlen(c); a ++)
      {
            if(flag&&c!='A')
            {
                printf("%d\n",a);
                flag=0;
            }
            if(c!='P'&&c!='A'&&c!='T')
                break;
            if(c=='P'&&c=='A'&&c=='T')
            {
                locat=a;
                a+=2;
                flag=1;
            }
            if(c=='P')
            {
                l=0;
                a++;
                while(c=='A')
                {
                  l++;
                  a++;
                }
                if(l==0)
                {
                  continue;
                }
                if(c=='T')
                {
                  flag=3;
                  locat=a-l-1;
                  a++;
                }
            }
      }
      if(flag)
      {
            for( a = 0; a < locat; a ++)
            {
                if(c!='A')
                {
                  flag=0;
                  break;
                }
            }
      }
      if(flag==1&&locat>strlen(c)-3-locat)
            flag=0;
      if(flag==3&&locat*l!=strlen(c)-locat-l-2)
      {
            //printf("%d %d\n",locat*l,strlen(c)-locat-l-2);
            flag=0;
      }
      if(flag)
            printf("YES\n");
      else
            printf("NO\n");
    }
    return 0;
}

行客 发表于 2019-2-28 11:35:50

根据三条规则来做,第一条好过,第二条就是要PAT两遍的字符串要么是空,要么是相同数量的A组成的字符串,第三条有问题,可能是题目没讲明白,题目的意思是PAT的P和A之间每增加一个A那么在右边要增加一次与左边相同数量A的字符串。
页: [1]
查看完整版本: 一道题的答案看不懂