比压牌

前言

NWAFU Content1102 AW


一、题目描述

题目描述

牌只有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

二、设计步骤

原始思路,看到b串后,我们根据b的牌型确定对a判断的条件,扫描一遍a并用num数组记录,而后对两类牌型分而治之。

定义Bool(不能定义为bool,bool是关键字)初值为0,当符合程序条件时将1赋给Bool,最后根据Bool的值控制输出。

需要注意三点:

1.fgets函数会读入换行符,因此size定义为字符串有效长度-1;

2.在定义key和扫描a时,需要注意字符串中的数字是char类型,需要 -'0'进行转换;

3.若牌型为【5】,在a中寻找时需从key+1开始查找。

PS:题目中内个 输入有多组数据 请忽略。如果需要实现也可以通过编写函数,在主函数中控制程序运行来实现。

#include
#include
#include
#define _CRT_SECURE_NO_WORNINGS
#define len 101

int main(void)
{
    int size,i,j,Bool = 0;       //size定义牌型,由Bool决定程序最终结果
    int num[10] = {0};           //num数组,用于统计手牌中下标对应数字出现次数
    char base[len],emy[len];     //base为手牌,emy为上家牌
    fgets(base,len,stdin);
    fgets(emy,len,stdin);

    int key = emy[0] - '0';      //上家牌的第一张

    size = strlen(emy) - 1;      //牌型,-1是为了去掉换行符
    if(size == 5){               //【5】牌型
        for(i = 0;i < strlen(base)-1;i++){               //扫描手牌
            num[base[i]-'0']++;
        }
        for(i = key+1;i <= 9;i++){                       //寻找顺子
            for(j = 0;j < 5;j++){
                if(!num[i+j])
                    break;
            }
            if(j == 5){          //判断循环次数
                Bool = 1;
                break;
            }
        }
    }
    else{                        //其他牌型
        for(i = 0;i < strlen(base) - 1;i++){
            num[base[i]-'0']++;
        }
        for(i = key+1;i <= 9;i++){                       //寻找符合条件的组合
            if(num[i] >= size){
                Bool = 1;
                break;
            }
        }
    }
    if(Bool)
        printf("YES");
    else
        printf("NO");
    printf("\n");
    return 0;
}

 小白的原始思路,有佬的修改意见请指导! 


总结

EOF

你可能感兴趣的:(c语言,学习方法)