ZCMU1713 打麻将(模拟)

ZCMU1713 打麻将(模拟)

Description

卡斯丁狗表示真月里那几天,天天在打麻将,他的手气很好,总是摸到三四个财神,于是他就怒赚了一波红包。由于长得帅,他就想把这个不可告人的赚钱胡牌大法告诉你。

已知胡牌公式是这样的XXXN+Y(Y+1)(Y+2)M+ZZ(N*M可以等于0)就可以胡牌。例如用1-9表示点数,字母abc分别表示条子,筒子,万子。那么 1a2a3a 3a4a5a 6b7b8b 9c9c9c 1b1b是可以胡牌的。为了教育初学者,现给出5张牌,问是否会胡牌。

Input

多组测试数据

输入一个含10个字符的字符串。

每种牌的个数<=4

Output

胡牌输出Y,否则输出N。

Sample Input

1a1a1a2b2b

1a2a3a2c2c

1a2a4a2c2c

1a2b3c4a4a

Sample Output

Y

Y

N

N

 

思路

一道模拟题,利用字符数组和整形数组的转换记录必要的数据,具体看代码和注释。

 

注意

一开始错了两个样例,读者可以测试以下

7a7a7a6a6a ---- Y

7a8a9a1c1c ---- Y

出现碰不能直接碰++,因为三张一样的牌可能被分成两部分:两张牌独自形成对,另一张牌与余下两张形成顺子,即同时出现碰和顺子这种情况。

代码

#include<bits/stdc++.h>
using namespace std;
int  pai[20][20];//一共27张牌,但要多开数组,否则之后的判断过程会有溢出
char s[10];//十个字符
int main()
{
    //freopen("fopen.txt","r",stdin);
    //freopen("fout.txt","w",stdout);
    while(~scanf("%s",s))
    {
        //为新数据清空
        int a_123=0,Double=0,Triple=0;//分别表示顺子、对、碰的个数
        int flag=0;
        memset(pai,0,sizeof(pai));
        //读入每张牌,并记录对应个数
        for(int i=0;i<=9;i+=2)
        {
            pai[ s[i]-'0'-1  ][ s[i+1]-'a' ]++;
        }
        //遍历统计找三个一样的和两个一样的
        for(int i=0;i<9;i++)//数组多开了,不用担心i+1,i+2越界。
            for(int j=0;j<3;j++)
            {
                if(pai[i][j]==3)
                {
                    Triple++;
                    //if语句不能就此结束,还需考虑同时出现碰和顺子这种情况
                    if(pai[i-2][j]==1&&pai[i-1][j]==1|| pai[i-1][j]==1&&pai[i+1][j]==1 || pai[i+1][j]==1&&pai[i+2][j]==1)
                    {
                        Triple--;Double++;a_123++;//碰拆成对子和顺子
                    }
                }
                else if(pai[i][j]==2) Double++;
            }
        //遍历找顺子
        for(int i=0;i<9;i++)//数组多开了,不用i+1,i+2担心越界。
            for(int j=0;j<3;j++)
            {
                if(pai[i][j]==1&&pai[i+1][j]==1&&pai[i+2][j]==1) a_123++;//找到顺子
            }
        if(Triple==1&&Double==1)//同时出现对和碰,胡了
            flag=1;
        else if(a_123==1&&Double==1)//同时出现对和数字,胡了
            flag=1;
        if(flag) printf("Y\n");
        else printf("N\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值