软件简介

麻将胡牌算法

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 指数为
超过 的项目

评论 (0)

加载中
更多评论
发表于AI & 大数据专区
2018/04/04 17:02

majiang_algorithm 1.0.8 发布,添加麻将出牌 AI 算法

简述 打麻将,需要运气,也需要脑力。作为玩家,需要搭好牌架子,然后一张一张的摸牌,最后达到听牌,最终胡牌。 本文讲述的即是AI如何尽量做到高智商的打麻将。其中摸牌我们是控制不了的,所以就在打牌上下手。 首先还是先复习下麻将玩法。 github地址 使用 maven <dependency>     <groupId>com.github.esrrhs</groupId>     <artifactId>majiang_algorithm</artifactId>     <version>1.0.8</version> </dep...

4
16
发表于AI & 大数据专区
2018/03/27 10:35

majiang_algorithm 1.0.4 发布,一种简单高效的胡牌算法

麻将胡牌算法 majiang_algorithm是带多张鬼牌的通用胡牌算法,采用查表方式,简单高效。 表生成 在生成表的阶段,时间是不值钱的,所以生成方法我们可以任意穷举。 首先分为普通、风、箭三张表。 穷举出所有的key,比如普通表,就是000000000-444420000,因为每一种牌最大4张,且总和不超过14张牌。 对于每个key,生成这个key在不同鬼的情况下的胡牌信息列表。 胡牌信息列表的内容是,在N张鬼的情况下,这个key胡什么牌,并且是...

4
16
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
2019/03/14 15:45

[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, in our example is: [53, 89, 150, 36, 633, 233] [3, 9, 0, 6, 3, 3] Then sort according to the last digit: [150, 53, 633, 233, 36, 89] Then using second last digit to the sort: [633, 233, 36, 150, 53, 89] Last using the last digist to do the sort, and using '0' if missing the dig...

0
0
发表了博客
2015/02/12 20:38

algorithm

lexicographical_compare 比较关系 此时没有大于,小于这类概念,而是按照先后规则进行排序,C++中有许多排序规则,如:std::less<T>,std::greater<T>,等等,这些规则都有一个共性, bool 对象名(或函数名)(const T &left,const T &right); // 若返回真,则表示 left 在 right 之前; // 若返回假,则表示 left 在 right 之后,或者 left 与 right 在同一位置.如: // std::less<int>()(3,7) 返回真,表明在 std::less...

0
0
发表了博客
2019/08/01 12:55

ReliefF Algorithm

# ReliefF Algorithm

0
0
发表了博客
2014/08/27 22:30

MD5 Algorithm(Message-Digest Algorithm 5)

Introduction MD5 algorithm was developed by Professor Ronald L. Rivest in 1991. According to RFC 1321, “MD5 message-digest algorithm takes as input a message of arbitrary length and produces as output a 128-bit "fingerprint" or "message digest" of the input …The MD5 algorithm is intended for digital signature applications, where a large file must be "compressed" in a secure manner before bei...

0
0
发表了博客
2020/08/20 08:21

【Algorithm】NMS

NMS: Input: A list of Proposal boxes B, corresponding confidence scores S and overlap threshold N. Output: A list of filtered proposals D. Algorithm: Select the proposal with highest confidence score, remove it from B and add it to the final proposal list D. (Initially D is empty). Now compare this proposal with all the proposals — calculate the IOU (Intersection over Union) of this proposal w...

0
0
发表了博客
2011/08/17 13:15

算法(algorithm)

算法(algorithm): 对一个现有的问题我们采取的解决过程及方法,可简单可复杂,可高效可低效。一个用算法实现的程序会耗费两种资源:处理时间和内存。很显然,一个好的算法应该是耗费时间少、所用内存低,但是,在实际中,我们往往不能两方面顾全! 算法的效率分析标准: 衡量算法是否高效主要是从以下几个方面来分析: ¨ 简单性和清晰度 一般我们都希望算法越简单越清晰就越好,但是要保证效率为前提。可是,往往我们在复杂的项...

0
5
发表了博客
2019/02/13 20:46

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.Kruskal's algorithm 2.1 Pseudocode A = ∅ foreach v ∈ G.V: MAKE-SET(v) foreach (u, v) in G.E ordered by weight(u, v), increasing: if FIND-SET(u) ≠ FIND-SET(v): A = A ∪ {(u, v)} UNION(u, v) return A 2.2 Complexity O(E logE) , equivalently, O(E log V) time ,because $$ E \le ...

0
0
发表了博客
2018/04/30 14:48

In Place Algorithm

本篇是in place algorithm的学习笔记。目前学习的是in place merge与in place martrix transposition这两个算法。 1.in place merge 论文链接:Practical in-place merging 论文讨论的是如何O(n)时间复杂度,O(1)空间复杂度合并两个相邻的有序数组。 b) 将sublist1与sublist2按sqrt(n)进行block划分, 余下的尾元素移到开头作为buffer( buffer size >= sqrt(n),我们不关注buffer内的元素是否有序 ) c) 选择排序( O(sqrt(n)*sqr...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
14 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部