鱼C论坛

 找回密码
 立即注册
查看: 4653|回复: 20

请各位大神帮忙看下我的代码哪里有问题

[复制链接]
发表于 2021-5-1 20:36:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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



源代码
#include<stdio.h>

int main(void)
{
        int n;
        int i;
        int result[10] = {0};
    char ch;

        scanf("%d", &n);
    getchar();

        for (i = 0; i < n; i++)
        {
                int p = 0, t = 0, a = 0;
                int flag = 1;     //judge if p a t
                int count0 = 0, count1 = 0, count2 = 0;   //the number of A of different position
                int position = 0;       //the position of A,initial 0,front of P

                while ((ch = getchar()) != '\n')
                {
                        if (ch == 'P')
                        {
                                p++;
                                position = 1;   //A between P and T
                        }
                        else if (ch == 'T')
                        {
                                t++;
                                position = 2;   //A is back of T
                        }
                        else if (ch == 'A')
                        {
                                a++;
                        }
                        else
                        {
                                flag = 0;
                                break;
                        }

                        switch (position)
                        {
                        case 0:count0++; break;
                        case 1:if (ch != 'P') count1++; break;
                        case 2:if (ch != 'T') count2++; break;
                        }
                }

                if (flag && p==1 && t==1 && (a != 0) && (count0 * count1 == count2))
                {
                        result[i] = 1;
                }
        }

        for (i = 0; i < n; i++)
        {
                if (result[i])
                {
                        printf("YES\n");
                }
                else
                {
                        printf("NO\n");
                }
        }

        return 0;
}

我最后只能输入六个字符串,找了好半天不知道是哪里错了,麻烦各位大神帮忙debug一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-2 07:03:37 From FishC Mobile | 显示全部楼层
上一贴你都没解释第⑤个和第八个为啥是错的
又重复发贴
告诉你,重复发贴不但没用,反而容易招来反感
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 17:28:52 | 显示全部楼层
wp231957 发表于 2021-5-2 07:03
上一贴你都没解释第⑤个和第八个为啥是错的
又重复发贴
告诉你,重复发贴不但没用,反而容易招来反感

大哥,我给你解释了啊,我说规律判断错了,具体解释的话就是正确的规律应该是,p之前的A*p和t之间的A=T后面的A的数量,才是正确的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-2 17:31:09 From FishC Mobile | 显示全部楼层
Christopher. 发表于 2021-5-2 17:28
大哥,我给你解释了啊,我说规律判断错了,具体解释的话就是正确的规律应该是,p之前的A*p和t之间的A=T后 ...

那这个为啥又正确呢
AAPAATAAAA
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 17:31:25 | 显示全部楼层
wp231957 发表于 2021-5-2 07:03
上一贴你都没解释第⑤个和第八个为啥是错的
又重复发贴
告诉你,重复发贴不但没用,反而容易招来反感

可能招你反感了,也可能是没有回答你的问题,抑或是说你也不知道这题是怎么回事,但是,你不想回答可以不回答,我也可以自己琢磨,没必要在这当圣母,你回不回答是你的权力,我回不回答你也同样是我的权利,请你有时间帮别人多看两道题,当然不用看我的,别在这当上帝
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-2 17:32:07 From FishC Mobile | 显示全部楼层
Christopher. 发表于 2021-5-2 17:31
可能招你反感了,也可能是没有回答你的问题,抑或是说你也不知道这题是怎么回事,但是,你不想回答可以不 ...

你牛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 17:33:22 | 显示全部楼层
wp231957 发表于 2021-5-2 17:31
那这个为啥又正确呢
AAPAATAAAA

2*2!=4?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 17:34:04 | 显示全部楼层

P前面有两个A,P,T中间有两个A,T后面有四个A,满足2*2=4
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 17:35:56 | 显示全部楼层

我是垃圾,也正因为我太垃圾,才会在这和你喋喋不休
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-2 18:09:36 | 显示全部楼层
这两行是怎么回事?
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-2 18:55:11 | 显示全部楼层
你的代码有两个语法问题,所以逻辑问题我就没有看
我自己写了一个给你参考
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <string.h>

  4. bool a(int ch_next) {
  5.     char ch;
  6.     size_t count = 0;
  7.     while(scanf("%c", &ch), ch == 'A') ++count;
  8.     ungetc(ch, stdin);
  9.     return ch == ch_next;
  10. }

  11. bool b(int ch_next) {
  12.     char ch;
  13.     size_t count = 0;
  14.     while(scanf("%c", &ch), ch == 'A') ++count;
  15.     ungetc(ch, stdin);
  16.     return ch == ch_next;
  17. }

  18. bool c(int ch_next) {
  19.     char ch;
  20.     size_t count = 0;
  21.     while(scanf("%c", &ch), ch == 'A') ++count;
  22.     ungetc(ch, stdin);
  23.     return ch == ch_next;
  24. }

  25. bool P(int ch_next) {
  26.     char ch;
  27.     size_t count = 0;
  28.     while(scanf("%c", &ch), ch == 'P') ++count;
  29.     ungetc(ch, stdin);
  30.     return count == 1 ? (ch == ch_next) : false;
  31. }

  32. bool A(int ch_next) {
  33.     char ch;
  34.     size_t count = 0;
  35.     while(scanf("%c", &ch), ch == 'A') ++count;
  36.     ungetc(ch, stdin);
  37.     return count == 1 ? (ch == ch_next) : false;
  38. }

  39. bool T(int ch_next) {
  40.     char ch;
  41.     size_t count = 0;
  42.     while(scanf("%c", &ch), ch == 'T') ++count;
  43.     ungetc(ch, stdin);
  44.     return count == 1 ? (ch == ch_next) : false;
  45. }

  46. int main(void) {
  47.     size_t n;
  48.     char ch;
  49.     scanf("%lu", &n);
  50.     while(scanf("%c", &ch), ch != '\n');
  51.     bool result[n];
  52.     memset(result, false, sizeof(bool) * n);
  53.     for(size_t i = 0; i < n; ++i) {
  54.         if(a('T')) result[i] = true;
  55.         if(P('A')) result[i] = true;
  56.         if(b('A')) result[i] = true;
  57.         if(A('T')) result[i] = true;
  58.         if(T(-1)) result[i] = true;
  59.         if(c(-1)) result[i] = true;
  60.         if(a(-1)) result[i] = true;
  61.         while(scanf("%c", &ch), ch != '\n');
  62.     }
  63.     for(size_t i = 0; i < n; ++i) {
  64.         result[i] ? puts("YES") : puts("NO");
  65.     }
  66.     return 0;
  67. }
复制代码

  1. 8
  2. PAT
  3. PAAT
  4. AAPATAA
  5. AAPAATAAAA
  6. xPATx
  7. PT
  8. Whatever
  9. APAAATAA
  10. YES
  11. YES
  12. YES
  13. YES
  14. NO
  15. NO
  16. NO
  17. YES
复制代码


有一个问题,APAAATAA 这个为什么输出的是 NO
aPbATca 这个规则中的b可以是0个或多个A,应该输出YES吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-2 19:15:19 | 显示全部楼层
我发现上面的代码有一个逻辑问题,不应该设置true,应该是默认true,设置false
这一次最后一个输出的是 NO,有点奇怪,我再研究研究
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <string.h>

  4. bool a(int ch_next) {
  5.     char ch;
  6.     size_t count = 0;
  7.     while(scanf("%c", &ch), ch == 'A') ++count;
  8.     ungetc(ch, stdin);
  9.     return ch == ch_next;
  10. }

  11. bool b(int ch_next) {
  12.     char ch;
  13.     size_t count = 0;
  14.     while(scanf("%c", &ch), ch == 'A') ++count;
  15.     ungetc(ch, stdin);
  16.     return ch == ch_next;
  17. }

  18. bool c(int ch_next) {
  19.     char ch;
  20.     size_t count = 0;
  21.     while(scanf("%c", &ch), ch == 'A') ++count;
  22.     ungetc(ch, stdin);
  23.     return ch == ch_next;
  24. }

  25. bool P(int ch_next) {
  26.     char ch;
  27.     size_t count = 0;
  28.     while(scanf("%c", &ch), ch == 'P') ++count;
  29.     ungetc(ch, stdin);
  30.     return count == 1 ? (ch == ch_next) : false;
  31. }

  32. bool A(int ch_next) {
  33.     char ch;
  34.     size_t count = 0;
  35.     while(scanf("%c", &ch), ch == 'A') ++count;
  36.     ungetc(ch, stdin);
  37.     return count == 1 ? (ch == ch_next) : false;
  38. }

  39. bool T(int ch_next) {
  40.     char ch;
  41.     size_t count = 0;
  42.     while(scanf("%c", &ch), ch == 'T') ++count;
  43.     ungetc(ch, stdin);
  44.     return count == 1 ? (ch == ch_next) : false;
  45. }

  46. int main(void) {
  47.     size_t n;
  48.     char ch;
  49.     scanf("%lu", &n);
  50.     while(scanf("%c", &ch), ch != '\n');
  51.     bool result[n];
  52.     for(size_t i = 0; i < n; ++i) result[i] = true;
  53.     for(size_t i = 0; i < n; ++i) {
  54.         do {
  55.             if((result[i] = a('T')) == false) break;
  56.             if((result[i] = P('A')) == false) break;
  57.             if((result[i] = b('A')) == false) break;
  58.             if((result[i] = A('T')) == false) break;
  59.             if((result[i] = T(EOF)) == false) break;
  60.             if((result[i] = c(EOF)) == false) break;
  61.             if((result[i] = a(EOF)) == false) break;
  62.         } while(0);
  63.         while(scanf("%c", &ch), ch != '\n');
  64.     }
  65.     for(size_t i = 0; i < n; ++i) {
  66.         result[i] ? puts("YES") : puts("NO");
  67.     }
  68.     return 0;
  69. }
复制代码

  1. 8
  2. PAT
  3. PAAT
  4. AAPATAA
  5. AAPAATAAAA
  6. xPATx
  7. PT
  8. Whatever
  9. APAAATAA
  10. NO
  11. NO
  12. NO
  13. NO
  14. NO
  15. NO
  16. NO
  17. NO
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-2 19:20:19 | 显示全部楼层
P和T中间有几个A?我的理解是1个或多个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 19:31:02 | 显示全部楼层
人造人 发表于 2021-5-2 19:20
P和T中间有几个A?我的理解是1个或多个

要是前后都没有的A的话,可以有大于0个,你的理解是正确的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 19:32:23 | 显示全部楼层
#include<stdio.h>

int main(void)
{
        int n;
        int i;
        int result[10] = {0};
    char ch;

        scanf("%d", &n);
    getchar();

        for (i = 0; i < n; i++)
        {
                int p = 0, t = 0, a = 0;
                int flag = 1;     //judge if p a t
                int count0 = 0, count1 = 0, count2 = 0;   //the number of A of different position
                int position = 0;       //the position of A,initial 0,front of P

                while ((ch = getchar()) != '\n')
                {
                        if (ch == 'P')
                        {
                                p++;
                                position = 1;   //A between P and T
                        }
                        else if (ch == 'T')
                        {
                                t++;
                                position = 2;   //A is back of T
                        }
                        else if (ch == 'A')
                        {
                                a++;
                        }
                        else
                        {
                                flag = 0;
                        }

                        switch (position)
                        {
                        case 0:count0++; break;
                        case 1:if (ch != 'P') count1++; break;
                        case 2:if (ch != 'T') count2++; break;
                        }
                }

                if (flag && p==1 && t==1 && (a != 0) && (count0 * count1 == count2))
                {
                        result[i] = 1;
                }
        }

        for (i = 0; i < n; i++)
        {
                if (result[i])
                {
                        printf("YES\n");
                }
                else
                {
                        printf("NO\n");
                }
        }

        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 19:34:04 | 显示全部楼层
最后我改出来了,是flag判断的那个地方,不能有break,否则的话,跳出循环,后面输入的被视为下一组输入,表达能力有限,见谅见谅
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 19:35:09 | 显示全部楼层
人造人 发表于 2021-5-2 19:15
我发现上面的代码有一个逻辑问题,不应该设置true,应该是默认true,设置false
这一次最后一个输出的是 NO ...

谢谢你啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 19:36:12 | 显示全部楼层
人造人 发表于 2021-5-2 18:55
你的代码有两个语法问题,所以逻辑问题我就没有看
我自己写了一个给你参考

这个规律就是我上面说的那个,你可以把他给的例子带入,我的那个公式是完全符合的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-2 19:38:57 | 显示全部楼层
人造人 发表于 2021-5-2 18:09
这两行是怎么回事?

抱歉,这个是笔误,不好意思(笑哭)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-2 22:34:37 | 显示全部楼层
我也改完了,这是最终版本
具体实现思路可以参考编译原理中的递归下降分析算法
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <string.h>

  4. /*
  5. * aPbATca
  6. * aPAbTc
  7. * a: (first: ('A', '\0'), follow: ('P'))
  8. * P: (first: ('P'), follow: ('A'))
  9. * A: (first: ('A'), follow: ('A', 'T'))
  10. * b: (first: ('A', '\0'), follow: ('T'))
  11. * T: (first: ('T'), follow: ('A', '\n'))
  12. * c: (first: ('A', '\0'), follow: ('\n'))
  13. */

  14. bool exist(int ch, int data[], size_t size) {
  15.     for(size_t i = 0; i < size; ++i) {
  16.         if(ch == data[i]) return true;
  17.     }
  18.     return false;
  19. }

  20. bool a(int first[], size_t first_size, int follow[], size_t follow_size, size_t depth) {
  21.     int ch = getchar();
  22.     if(exist(ch, first, first_size)) {
  23.         return a(first, first_size, follow, follow_size, depth + 1);
  24.     }
  25.     if(depth == 0) {
  26.         if(!exist('\0', first, first_size)) return false;
  27.     }
  28.     if(!exist(ch, follow, follow_size)) return false;
  29.     ungetc(ch, stdin);
  30.     return true;
  31. }

  32. bool P(int first[], size_t first_size, int follow[], size_t follow_size, size_t depth) {
  33.     if(depth == 2) return false;
  34.     int ch = getchar();
  35.     if(exist(ch, first, first_size)) {
  36.         return a(first, first_size, follow, follow_size, depth + 1);
  37.     }
  38.     if(depth == 0) {
  39.         if(!exist('\0', first, first_size)) return false;
  40.     }
  41.     if(!exist(ch, follow, follow_size)) return false;
  42.     ungetc(ch, stdin);
  43.     return true;
  44. }

  45. bool A(int first[], size_t first_size, int follow[], size_t follow_size, size_t depth) {
  46.     if(depth == 2) return false;
  47.     int ch = getchar();
  48.     if(exist(ch, first, first_size)) {
  49.         return a(first, first_size, follow, follow_size, depth + 1);
  50.     }
  51.     if(depth == 0) {
  52.         if(!exist('\0', first, first_size)) return false;
  53.     }
  54.     if(!exist(ch, follow, follow_size)) return false;
  55.     ungetc(ch, stdin);
  56.     return true;
  57. }

  58. bool b(int first[], size_t first_size, int follow[], size_t follow_size, size_t depth) {
  59.     int ch = getchar();
  60.     if(exist(ch, first, first_size)) {
  61.         return a(first, first_size, follow, follow_size, depth + 1);
  62.     }
  63.     if(depth == 0) {
  64.         if(!exist('\0', first, first_size)) return false;
  65.     }
  66.     if(!exist(ch, follow, follow_size)) return false;
  67.     ungetc(ch, stdin);
  68.     return true;
  69. }

  70. bool T(int first[], size_t first_size, int follow[], size_t follow_size, size_t depth) {
  71.     if(depth == 2) return false;
  72.     int ch = getchar();
  73.     if(exist(ch, first, first_size)) {
  74.         return a(first, first_size, follow, follow_size, depth + 1);
  75.     }
  76.     if(depth == 0) {
  77.         if(!exist('\0', first, first_size)) return false;
  78.     }
  79.     if(!exist(ch, follow, follow_size)) return false;
  80.     ungetc(ch, stdin);
  81.     return true;
  82. }

  83. bool c(int first[], size_t first_size, int follow[], size_t follow_size, size_t depth) {
  84.     int ch = getchar();
  85.     if(exist(ch, first, first_size)) {
  86.         return a(first, first_size, follow, follow_size, depth + 1);
  87.     }
  88.     if(depth == 0) {
  89.         if(!exist('\0', first, first_size)) return false;
  90.     }
  91.     if(!exist(ch, follow, follow_size)) return false;
  92.     ungetc(ch, stdin);
  93.     return true;
  94. }

  95. int main(void) {
  96.     size_t n;
  97.     char ch;
  98.     scanf("%lu", &n);
  99.     while(scanf("%c", &ch), ch != '\n');
  100.     bool result[n];
  101.     for(size_t i = 0; i < n; ++i) result[i] = true;
  102.     for(size_t i = 0; i < n; ++i) {
  103.         do {
  104.             if((result[i] = a((int []){'A', '\0'}, 2, (int []){'P'}, 1, 0)) == false) break;
  105.             if((result[i] = P((int []){'P'}, 1, (int []){'A'}, 1, 0)) == false) break;
  106.             if((result[i] = A((int []){'A'}, 1, (int []){'A', 'T'}, 2, 0)) == false) break;
  107.             if((result[i] = b((int []){'A', '\0'}, 2, (int []){'T'}, 1, 0)) == false) break;
  108.             if((result[i] = T((int []){'T', '\0'}, 2, (int []){'A', '\n'}, 2, 0)) == false) break;
  109.             if((result[i] = c((int []){'A', '\0'}, 2, (int []){'\n'}, 1, 0)) == false) break;
  110.         } while(0);
  111.         while(scanf("%c", &ch), ch != '\n');
  112.     }
  113.     for(size_t i = 0; i < n; ++i) {
  114.         result[i] ? puts("YES") : puts("NO");
  115.     }
  116.     return 0;
  117. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表