麻将查表法(1)

7 篇文章 0 订阅

参考

麻将程序对和牌判断的逻辑是什么?有比「暴力搜索」更先进的算法么?
日本解决方法(需要翻墙)

题记

开始优化麻将胡法,首先反应理论上查表是最快的,但是没有对查表使用的印象,于是看看有没有参考的,开始参考日本的查表,基本胡牌,再加上一些特殊胡牌方式,因为是日麻,百搭还有字成顺没有,那就先开始这个来先熟悉下查表法

查表法

思路很简单,也就是把所有可能全部列成表,一个key对应一个value,根据key来找所需要的值
在参考思路中key 代表牌的结构,value代表刻子,对子,顺子的位置,个数和其它特殊胡法
(其实难度就是怎么全部遍历出所有情况,不漏,不过参考中对key 防止大于32位 有特殊的处理,思路值得一看,ruby 生成表,java判断,不要问我怎么看懂ruby,就是硬啃)

这个算是翻译?再加自己理解(不考虑百搭,字成顺)

对于牌的定义及一些词的意思:
颜色\值0x010x020x030x040x050x060x070x080x09
0x100x11/一万0x12/二万0x13/三万0x14/四万0x15/五万0x16/六万0x17/七万0x18/八万0x19/九万
0x200x21/一筒0x22/二筒0x23/三筒0x24/四筒0x25/五筒0x26/六筒0x27/七筒0x28/八筒0x29/九筒
0x300x31/一条0x32/二条0x33/三条0x34/四条0x35/五条0x36/六条0x37/七条0x38/八条0x39/九条
0x400x41/东0x42/南0x43/西0x44/北0x45/中0x46/发0x47/白————

牌型:能胡的牌数量的列表

  1. 生成Key
    1.1. 对手牌抽象成数字(不在乎其它信息,只注意牌的数量,要根据牌型生成key)
     0x13,0x15,0x18,0x18,0x26,0x28,0x29,0x31,0x31,0x32,0x38,0x42,0x43,0x44 --> [1,1,2,1,1,1,2,1,1,1,1,1]
     0x11,0x12,0x15,0x16,0x21,0x23,0x26,0x32,0x36,0x36,0x38,0x41,0x44,0x45 --> [1,1,1,1,1,1,1,1,2,1,1,1,1]

     如果把这个数据直接为key,那么会发现key的最大位数有14位,那么最起码要用uint64_t来存储,这个时候会浪费过多
     的内存

    1.2.用0对不连续的数进行分割(方便找出所有胡牌可能)
     0x13,0x15,0x18,0x18,0x26,0x28,0x29,0x31,0x31,0x32,0x38,0x42,0x43,0x44 --> [1,0,1,0,2,0,1,0,1,1,0,2,1,0,1,0,1,1,1]
     0x11,0x12,0x15,0x16,0x21,0x23,0x26,0x32,0x36,0x36,0x38,0x41,0x44,0x45 --> [1,1,1,1,1,1,1,1,2,1,1,1,1]

麻将查表法(DFS暴力所有可能)(2)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值