带百搭的麻将胡牌判断算法

本文介绍了一种支持百搭的麻将胡牌判断算法,通过整数数组表示一手牌,先进行预处理,然后利用理牌算法判断是否胡牌。算法通过递归处理牌组,尝试组合刻子、顺子,并使用百搭牌进行配合,最终找出可能的胡牌方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前我写了一个判断麻将是否胡牌的算法,不过不支持百搭。最近有一个朋友问我,如何有百搭,算法如何写。我写了一个,贴出来,让网友看看。

算法输入: 整数数组 a[0..n-1]表示一手牌,其中,n 是牌的张数,比如 14。 

                牌的编码可自定,比如: 101-109 表示一万到九万,

                                                201-209表示一条到九条,

                                                301-309表示一筒到九筒,

                                                411,421,431,441,451,461,471表示东南西北中发白,

                                               500表示百搭。

算法预处理:

若 n 模 3不等于 2,直接输出:牌数不对,是相公,算法结束。否则:

把百搭删除,把剩下的普通牌进行排序:

    int i,m;

    m=0;

   for (i=0;i<n;i++)

   if (a[i]不是百搭) a[m++]=a[i];   // m 就是普通牌的张数

  把 a 中前 m 个元素进行排序;

随后,我把 a 看成左、中、右三段,其中,左侧段表示“成牌区”,即:它们由刻、顺组成;

中段表示试探区,算法要重点处理它们;而右侧段则是“杂牌”区,即:它们由非刻非顺组成。

在算法预处理后,显然,a 的左段长度为0,中段长度是m,右段长度是0,调用下面的“理牌”算法:

LiPai(a,0,m,0,n-m);

其中,n-m是指百搭的张数。

理牌算法:

void LiPai(int a[],int LeftCount,int MidCount,int RightCount,int CountOfBaiDa)

{

    if (MidCount<3)                   // 试探区已不足 3 张,理牌过程结束,进入“理杂牌”阶段

   {

      调用测试算法;   // 见后文

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值