【九度OJ】题目1175:打牌 解题报告

【九度OJ】题目1175:打牌 解题报告

标签(空格分隔): 九度OJ


http://ac.jobdu.com/problem.php?pid=1175

题目描述:

牌只有1到9,手里拿着已经排好序的牌a,对方出牌b,用程序判断手中牌是否能够压过对方出牌。
规则:出牌牌型有5种
1一张 如4 则5…9可压过
[2]两张 如44 则55,66,77,…,99可压过
[3]三张 如444 规则如[2]
[4]四张 如4444 规则如[2]
[5]五张 牌型只有12345 23456 34567 45678 56789五个,后面的比前面的均大。

输入:

输入有多组数据。
每组输入两个字符串(字符串大小不超过100)a,b。a字符串代表手中牌,b字符串代表处的牌。

输出:

压过输出YES 否则NO。

样例输入:

12233445566677
33

样例输出:

YES

Ways

这个题好难。

首先看得懂题目,题目说的是判断b出了一次牌,看自己能不能降服,而不是说降服b手里的所有牌。

就是b的牌是符合题意的五类牌之一,a的牌是所有牌。

明白之后就简单了,判断b是否是5张牌,如果不是就是都一样的,判断自己都一样的牌数是否超过即可。

如果b是5张牌那么就是递增数列,看自己的递增数列是否有比他大的。

出现错误点:memset(num, 0, sizeof(num));,后边一定是sizeof(),因为int占4个字符。

另外判断自己连续5张牌的时候还是简单粗暴点比较好,刚开始用循环,如果有1个0就停止,这种方法不对:比如对方出的12345,如果判断自己没有2就认输是很荒唐的。

还有自己写的数组代码有的从0开始放,有的从1开始,这样很不好,以后注意吧。

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

int main() {
    char card[101];
    char b[101];
    int num[10];
    while (scanf("%s%s", card, b) != EOF) {
        memset(num, 0, sizeof(num));//int是4字节
        int lenCard = strlen(card);
        int lenb = strlen(b);
        for (int i = 0; i < lenCard; i++) {
            num[card[i] - '0']++;
        }
        bool isWin = false;
        if (lenb < 5) {
            for (int i = b[0] - '0' + 1; i < 10; i++) {
                if (num[i] >= lenb) {
                    printf("YES\n");
                    isWin = true;
                    break;
                }
            }
            if (!isWin) {
                printf("NO\n");
            }
        } else {
            for (int i = b[0] - '0' + 1; i < 6; i++) {
                if (num[i] != 0 && num[i + 1] != 0
                    && num[i + 2] != 0 && num[i + 3] != 0
                    && num[i + 4] != 0) {
                    printf("YES\n");
                    isWin = true;
                    break;
                }
            }
            if (!isWin) {
                printf("NO\n");
            }
        }
    }

    return 0;
}

Date

2017 年 3 月 16 日

posted @ 2017-03-16 22:25  负雪明烛  阅读(28)  评论(0编辑  收藏  举报