请教麻将的牌型分析算法

thinkli 2012-07-21 09:36:21
只考虑最基本的麻将胡牌方式,即3+3+3+3+2。

以下面的一手牌为例,

4万 4万 5万 6万 7万 8万 5筒 6筒 6筒 7筒 4条 4条 南风 中 (共14张)

综合已有资料得到一个大概的思路是,

将这手牌划分为已经格好的3张组合(set)和2张组合(距离一个set只差一张),
比如一个set:4万 5万 6万 或者4万 4万 4万。

距离一个set只差一张的2张组合: 5筒 6筒 或者 4条 4条。


现在的问题是,怎么求得该手牌距离成胡(3+3+3+3+2)需要的最少张数。

对于每种可能的牌型划分,都会从牌墙剩下的牌里取任意一张(34张牌里还没有打完的牌),同时从手中的牌中扔掉任意一张,直到所有的2张组合都被消掉只剩下单张牌或者已不可能成为set的2张组合(可以从此得到该牌型下所需的成胡张数)。

在此过程中,得到一个成胡所需的最小张数。

请教各位,有什么好的思路完成这个搜索过程吗(高效一点或者容易实现)?有点类似迷宫问题但约束条件又比较复杂。
...全文
1596 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿宣22 2012-08-13
  • 打赏
  • 举报
回复
这个问题还算是比较容易实现的,首先我们要定义出三个成对的规则:a连续三张,b同牌三张,然后两个成对的规则,A:直接连续或间接连续(有可能构成三张连续);B:相同配对(胡牌需要的引子,当然也可以单调);有了这个就是基础了。然后可以跟具距离(3+3+3+2)的缺牌数(可以用自己以构成3的个数和2的个数反演),以组合成功的概率对自己的牌出点一张之后的余牌进行评估打分;分数最多的剩余组合为选定组合。要想加深ai的智商,评分策略就需要考虑冒险(被别人胡)和控制(控制下家的吃牌);这样就有些复杂了,略过。要想性能优(计算时间短),只要利用一些已知的特性(上一次余拍的结果)少用循环就行了,因为对敌人的牌是未知,只知道出的牌,所以思考深度几乎不必考虑(这一点与棋类游戏不同),即是说性能这一块无论怎么乱写都应该是可以接受的。
thinkli 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

我也觉得这个问题有点没什么大的意义。不过想法确实有点给力,请教一下腾讯的大神吧。
[/Quote]

其实也可以想下面一个问题:除了自己手牌之外的牌里,有多少种成胡的胡法。
thinkli 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

张数大于1的情况还有实际意义吗。

刚毕业时候做过这个判断,好像挺简单的。就是暴力把所有牌都当作胡牌加进来,然后判断是否能胡就行了。那时候是DOS时代,486的机子速度做这个判断都快得吓人。
[/Quote]

不是判断听哪张牌,那个不值得讨论。

广义上说,是如何从现有的手牌得到上听所需张数以及在此张数情况下胡牌的牌型数,进而实现自动出牌。
nixihz1990 2012-07-24
  • 打赏
  • 举报
回复
我也觉得这个问题有点没什么大的意义。不过想法确实有点给力,请教一下腾讯的大神吧。
TryToday 2012-07-24
  • 打赏
  • 举报
回复
张数大于1的情况还有实际意义吗。

刚毕业时候做过这个判断,好像挺简单的。就是暴力把所有牌都当作胡牌加进来,然后判断是否能胡就行了。那时候是DOS时代,486的机子速度做这个判断都快得吓人。
thinkli 2012-07-21
  • 打赏
  • 举报
回复
现在的问题是,怎么求得该手牌距离成胡(3+3+3+3+2)需要的最少张数。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧