1003 我要通过!(C和C++版本)

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int main(void)
 6 {
 7     char a[10][100];//用二维数组来表示 ,10表示不超过十个自然数,100存储长度不超过100的字符串 
 8     int n, k, m, j = -1, t = -1, h = -1, x = 0, y = 0, z = 0;//定义一些变量 
 9     scanf("%d", &n);//输入自然数个数限定 
10     for (k = 0; k<n; ++k)//循环输入自然数 
11     {
12         scanf("%s", a[k]);
13     }
14     for (k = 0; k<n; ++k, x = 0, y = 0, z = 0, j = -1, t = -1)/*这里重要,后面的定义是以大局观来讲的。首先对k循环,遍历数组。定义x,y,z表示下面符合要求的个数(分别求出字符A,在P前数量
15     在P与T之间数量,T之后数量,定义j,t实际相当于做一个标识,表示,字符串遍历到的位置为P,T*/ 
16     {
17         if (strchr(a[k], 'P') != NULL && strchr(a[k], 'A') != NULL && strchr(a[k], 'T') != NULL)//(strchr检测字符串中是否包含此字符), 此式检测字符串中是否含有P,A,T字符 
18         {
19                 for (m = 0; a[k][m] != '\0'; m++)//k用来遍历数组,m进入数组,遍历数组内容,对数组内容进行检测 
20                 {
21                     if (a[k][m] != 'P'&&a[k][m] != 'A'&&a[k][m] != 'T')//这个是对要求1的检测 
22                     {
23                         printf("NO\n");
24                         break;
25                     }
26                         if (a[k][m] == 'P')//遇到P时,标识,进入下一个字符 
27                         {
28                             j = m;
29                             continue;
30                         }
31                         if (a[k][m] == 'T')//与上面P类似 
32                         {
33                             t = m;
34                             continue;
35                         }
36                         if (a[k][m] == 'A')//... ... 
37                         {
38                             if (j == -1 && t == -1)//检测当j,t都为原值时,表明未遇到P,此时计算P前字符A的数量 
39                             {
40                                 ++x;
41                             }
42                             if (j != -1 && t == -1)//检测,当j不为原值,t为原值,表明遇到P未遇到t,计算字符P,T之间的字符A的数量 
43                             {
44                                 ++y;
45                             }
46                             if (j != -1 && t != -1)//计算T之后字符A的数量 
47                             {
48                                 ++z;
49                             }
50                         }
51 
52                 }
53         }
54         else
55         {
56             printf("NO\n");// 不满足条件1,打出NO 
57         }
58         if (x*y == z && y != 0)//检测字符A的数量是否满足关系,且P,T之间,字符A的数量不能为0 
59             printf("YES\n");
60         else//A不满足数量关系 
61         {
62             if (j != -1 || t != -1)//表示是检测完字符串的,j,t改变 
63             {
64                 printf("NO\n");
65             }
66         }
67     }
68     system("PAUSE");
69     return 0;
70 }

还是借鉴别人的提示,知道了后面一句的意思。要实现的是,使在字符P之前的A数量*P,T之间A的数量=T后面A的数量

这PAT提示的错误不知道哪里错了,看到很无奈,输入输出明明和它一样.=.=.....

 

2018-03-14 18:11

补充:发现一个问题,这道题PAT满足条件,那TAP也是应该满足条件的,我查了网上其他人用C和C++完成且通过这道题的人的代码,发现PAT是yes,TAP是NO,不知道是不是这道题的缺陷。

2018-03-14 18:11

补充:以为是''\n''是不是最后一个不能有,于是加上了一个判断语句。

for...
{
    w=n;
...
    if(w!=n-1)
    {
        printf("\n");
    }
...

形式是这样的,还是错了,还是那个点....

2018-09-18 22:03

今天试一次通过,之前的作为记录不删掉:

还是理清楚思路:

1.先看要求,总结一下,

a.只能有'P','A','T'

b.条件二:AAPATAA,PAT都满足,条件三,刚开始看没思路,可以这样理解,由aPbTc-->aPbATca,之间由于b增加了一个‘A’,c就增加了一个a,可以列出关系式:a中的‘A’个数 *(b中‘A’的数量+'P'  'T'之间‘A’的数量) = c中‘A’的数量

 + 'P'  'T'之间‘A’的数量*a中的‘A’个数化简之后就是,a中的‘A’个数 * b中‘A’的数量 = c中‘A’的数量

C++版本:

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

#pragma warning(disable:4996)

int main(void)
{
    int n, pos[3] = { 0 }, num[3] = { 0 }, tf[3] = { 0 };
    char str[102] = { 0 };

    scanf("%d", &n);
    while (n--) {
        scanf("%s", &str);
        tf[0] = tf[1] = tf[2] = 0;
        pos[0] = pos[1] = pos[2] = 0;
        num[0] = num[1] = num[2] = 0;
        for (size_t i = 0; i < strlen(str); ++i) {
            if (str[i] == 'P') {
                ++tf[0];
                pos[0] = i;
            }
            if (str[i] == 'T') {
                ++tf[1];
                pos[1] = i;
            }
            if (str[i] == 'A') {
                ++tf[2];
            }
            if (str[i] != 'P' && str[i] != 'A' && str[i] != 'T') {
                tf[0] = 666;
                break;
            }
        }
        if (tf[0] != 1 || tf[1] != 1 || tf[2] == 0) {
            printf("NO\n");
            continue;
        }

        for (int k = 0; k < strlen(str); ++k) {
            if (k < pos[0])
                if (str[k] == 'A')
                    ++num[0];
            if (k > pos[0] && k < pos[1])
                if (str[k] == 'A')
                    ++num[1];
            if (k > pos[1])
                if (str[k] == 'A')
                    ++num[2];
        }

        if (num[2] == num[0] * num[1]) {
            printf("YES\n");
            continue;
        }
        else{
            printf("NO\n");
            continue;
        }
    }

    return 0;
}

 

#include <bits/stdc++.h>
#include <string.h>
using namespace std;

int main()
{
    int n, pos[3] = { 0 }, num[3] = { 0 }, tf[3] = { 0 };
    string s;

    cin >> n;
    while (n--) {
        cin >> s;
        tf[0] = tf[1] = tf[2] = 0;
        pos[0] = pos[1] = pos[2] = 0;
        num[0] = num[1] = num[2] = 0;
        for (size_t i = 0; i < s.size(); ++i) {
            if (s[i] == 'P') {
                ++tf[0];
                pos[0] = i;
            }
            if (s[i] == 'T') {
                ++tf[1];
                pos[1] = i;
            }
            if (s[i] == 'A') {
                ++tf[2];
            }
            if (s[i] != 'P' && s[i] != 'A' && s[i] != 'T') {
                tf[0] = 666;
                break;
            }
        }
        if (tf[0] != 1 || tf[1] != 1 || tf[2] == 0) {
            cout << "NO" << endl;
            continue;
        }

        for (int k = 0; k < s.size(); ++k) {
            if (k < pos[0])
                if (s[k] == 'A')
                    ++num[0];
            if (k > pos[0] && k < pos[1])
                if (s[k] == 'A')
                    ++num[1];
            if (k > pos[1])
                if (s[k] == 'A')
                    ++num[2];
        }

        if (num[2] == num[0] * num[1]) {
            cout << "YES" << endl;
            continue;
        }
        else{
            cout << "NO" << endl;
            continue;
        }
    }

    
    return 0;
}

 

C语言版本:

 

posted @ 2018-03-13 21:56  Hk_Mayfly  阅读(821)  评论(0)    收藏  举报