majiang_algorithm 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
majiang_algorithm 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
授权协议: MIT
开发语言: Java
操作系统: 跨平台
收录时间: 2018-03-25
提 交 者: shitfuck

麻将胡牌算法

majiang_algorithm是带多张鬼牌的通用胡牌算法,采用查表方式,简单高效。

表生成

在生成表的阶段,时间是不值钱的,所以生成方法我们可以任意穷举。

首先分为普通、风、箭三张表。

穷举出所有的key,比如普通表,就是000000000-444420000,因为每一种牌最大4张,且总和不超过14张牌。

对于每个key,生成这个key在不同鬼的情况下的胡牌信息列表。

胡牌信息列表的内容是,在N张鬼的情况下,这个key胡什么牌,并且是否有将。

例如1万2万5万5万:110020000,生成的胡牌信息有。

1万2万5万5万:鬼0 有将 胡3万(0个鬼的时候,这个牌胡3万,此时有将)
1万2万5万5万:鬼1 无将 胡3万胡5万(1个鬼的时候,这个牌胡3万5万,此时无将)
1万2万5万5万:鬼1 有将 胡了(1个鬼的时候,这个牌已经胡了(鬼变成3万),此时有将)
1万2万5万5万:等等...

胡牌算法

有了前面辛苦生成的表格,那么判断胡牌算法就很简单了。对玩家手上的牌进行编码,变成多个key和鬼牌总数。N,例如手牌如下

得到key:110020000、020000000和鬼牌总数2。

对每个key查询表,得到对应的胡牌信息列表。

针对每组列表,过滤掉鬼牌总数>N的项以及没有胡的项,上面的例子就会有。

1万2万5万5万:鬼1 有将 胡了
2筒2筒:鬼1 无将 胡

简单递归下,看看几组胡牌信息列表里,是否满足鬼牌总数和只有一个将的约束。

如果有任意组合满足,则胡了,在上面的例子里,恰好满足条件,于是胡了。

总耗时:查表耗时*M + 递归M层分配鬼和将的耗时M是花色数目,M<=5。

查胡算法

与胡牌算法类似,根据key查出胡牌信息列表。

简单递归下,找出满足鬼的总数和只有一个将的约束时,所有不能胡的胡牌信息里可胡牌的集合,就是这手牌能胡什么牌。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

majiang_algorithm 的相关博客

[Algorithm] Radix Sort Algorithm

For example we have the array like this: [53, 89, 150, 36, 633, 233] First step is using Counting sort for last digit...

algorithm

记录了 algorithm 头文件中声明的算法函数的使用

ReliefF Algorithm

ReliefF Algorithm

【Algorithm】NMS

NMS: Input: A list of Proposal boxes B, corresponding confidence scores S and overlap threshold N. Output: A list of ...

EM Algorithm

Expectation Maximization Algorithm EM算法和之前学的都不太一样,EM算法更多的是一种思想,所以后面用几个例子讲解,同时也...

算法(algorithm)

算法(algorithm): 对一个现有的问题我们采取的解决过程及方法,可简单可复杂,可高效可低效。一个用算法实现的程序会耗费两种...

MD5 Algorithm(Message-Digest Algorithm 5)

Introduction MD5 algorithm was developed by Professor Ronald L. Rivest in 1991. According to RFC 1321, “MD5 message...

Prim's Algorithm & Kruskal's algorithm

1. Problem These two algorithm are all used to find a minimum spanning tree for a weighted undirected graph. 2.Kruska...

Algorithm_Test

<?php   class algorithm{          /**      * 第20题:      *题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。     ...

[Algorithm]排序

一.排序算法 1.插入排序 1) 直接插入排序:(插入类) 1 void InsertSort( ElemType R[], int n ) 2 { 3 for ( int i =...

majiang_algorithm 的相关问答

还没有任何问答,马上提问

评论 (0)

加载中
更多评论
0 评论
15 收藏
分享
返回顶部
顶部