基础知识

本文涉及的所有名词均在博文中有说明: http://blog.csdn.net/kunyus/article/details/78644517

核心思想

  1. 去伪存真: 满足胡牌的部分, 要么是 {3*n}(不带将), 要么是 {3*n+2}(带将).

  2. 端本正源: 麻将牌胡牌(除特殊规则)和牌面没有直接关系, 只和数量以及所处位置(顺子)相关.

  3. 去粗取精: 麻将牌所有组合中, 只有顺子和其他牌有关联关系,且关系只存在于相连的两张牌中.

完整处理流程

生成中间表

  1. 将序数牌按花色以及牌个数进行归表并记录表中牌的总个数.

    此处用万举例, 其他花色结果一样:

    • 手牌 万: 1-9 各一张, 此时表内容应为: 111111111(9)
    • 手牌 万: 11 22 333 4 5 6 77 88, 此时表内容应为: 2231112200(14)
  2. 将字牌按牌个数进行归表并记录表中牌的总个数, 相邻牌用 0 隔开.

    如: 东风 南风 西风 北风 红中 发财 白板, 表内容: 1010101010101(7)

  3. 任意表中牌个数出现不满足 {3*n} 且不满足 {3*n+2} 的, 直接判定无法胡牌.


type MTable struct {Count intTiles []int
}// 0x01 - 0x09 - 筒
// 0x11 - 0x19 - 万
// 0x21 - 0x29 - 条
// 0x31 0x33 0x35 - 中发白
// 0x41 0x43 0x45 0x47 - 东南西北func compileTiles(unlockTiles []byte) (int, error) {mtables := make([]MTable, 7)for i, _ := range mtables {mtables[i].Tiles = make([]int, 9)}for _, tile := range unlockTiles {group := tile / 0x10if int(group+1) > len(mtables) {return 0, errors.New("unrecognized type " + strconv.Itoa(int(group)) + " of tile")}tile := tile % 0x10 - 1if int(tile) > (len(mtables[group].Tiles) - 1) {return 0, errors.New("unrecognized tile " + strconv.Itoa(int(tile)))}mtables[group].Count++mtables[group].Tiles[tile]++if mtables[group].Tiles[tile] > 4 {return 0, errors.New("abnormal number " + strconv.Itoa(mtables[group].Tiles[tile]) + " of tile " + strconv.Itoa(int(tile)))}}super := 0for _, slice := range mtables {if 0 == slice.Count{continue}rest := slice.Count % 3 if 0 != rest && 2 != rest {return 0, errors.New("slice length " + strconv.Itoa(int(slice.Count)) + " check does not pass")}if err := decomposeMTable(slice.Tiles); nil != err{return 0, err}}return super, nil
}

处理中间表

  1. 分别对生成的中间表进行正向遍历, 并分别进行 2 - 6 步处理.

  2. 当前位是否为 0, 为 0 直接跳到下一个继续处理.

  3. 当前值是否为 1 且表长度大于 3, 满足分别对当前值和后两个值减 1 , 出现负数无法胡牌.

  4. 当前位是否为 2, 满足将其视为刻子, 值改 0, 跳到下一个继续处理

  5. 当前位是否为 3 , 满足将值改为 1 跳到步骤 2 处理, 处理失败无法胡牌.

  6. 当前位是否为 4, 满足将值改为 1 跳到步骤 2 处理, 处理失败将值改为 1 跳到步骤 2 处理, 处理失败无法胡牌.


func decomposeMTable(slice []int) (error){sliceSize := len(slice)for index := 0; index < sliceSize; index++ {tileCount := slice[index]switch(tileCount){case 0:continuecase 1:if (sliceSize - index) < 3 {return errors.New("failed to remove sequence, slice length is not enough")}for k := 0; k < 3; k++{if slice[index + k] < 1 {return errors.New("failed to remove sequence, continuous tile does not exist")}slice[index + k]--}case 2:slice[index] = 0default: // 3 && 4slice[index] -= 2for ; slice[index] > 0; slice[index]--{tslice := make([]int,len(slice) - index)copy(tslice, slice[index:])if err := decomposeMTable(tslice); nil == err{return nil}}if 4 == tileCount {return errors.New("there can not be four identical tiles")}slice[index] = 0}if 0 != slice[index]{return errors.New("unexpected error")}}return nil
}

棋牌麻将 - 无癞子胡牌算法(优化)相关推荐

  1. 棋牌麻将 - 无癞子胡牌算法(第三版)

    基础知识 本文涉及的所有名词均在博文中有说明: http://blog.csdn.net/kunyus/article/details/78644517 测试结果 测试环境: MEM: 4 GB CP ...

  2. 棋牌麻将 - 无癞子胡牌算法

    基础知识 本文涉及的所有名词均在博文中有说明: http://blog.csdn.net/kunyus/article/details/78644517 核心思想 去除杂念: 由于字牌中只只允许出现 ...

  3. erlang实现麻将胡牌以及癞子胡牌算法

    判断胡牌 麻将胡牌其实是按照nAAA + mABC + DD的套路,算法判断也很好实现,找出DD,然后剩下的牌都能形成AAA或者ABC即可胡牌.本文只介绍麻将普通胡牌的算法,该算法经过验证可判断除特殊 ...

  4. 癞子胡牌(听牌)算法

    import java.util.ArrayList; import java.util.Collections; import java.util.List;public class LaiZiTi ...

  5. 带赖子的麻将胡牌算法Java_带赖子的超高效麻将、跑胡子胡牌算法

    文档 github地址 https://github.com/yuanfengyun/qipai/tree/master/doc lua版 https://github.com/yuanfengyun ...

  6. 带赖子的超高效麻将、跑胡子胡牌算法

    腾讯课堂视频讲解:https://ke.qq.com/course/305608?tuin=104cb0e2 文档 github地址 https://github.com/yuanfengyun/qi ...

  7. 可带癞子的通用麻将胡牌算法

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. 笔者前段时间做过一款地方麻将 ...

  8. 麻将胡牌算法-癞子牌特别多(一)

    麻将内最核心的算法,每一次出牌,摸牌都需要使用到.(仅个人想法,想要更快速度,建用把算出来的结果存储下来,通过查表法来使用) 1.计算前准备 /*癞子数量*/protected byte laiNum ...

  9. 包含癞子的麻将胡牌算法

    记录一下麻将的通用胡牌算法实现,只要满足M x ABC + N x DDD + EE 即可胡牌. 在这里先分析一下最简单的胡牌思路:先找出所有可能的将牌,若除去两张将牌之外的所有牌都能成扑,则可胡牌. ...

最新文章

  1. 无废话XML--XML约束(DTD)
  2. Android之Launcher分析和修改4——初始化加载数据
  3. 互联网日报 | 京东数科科创板IPO获受理;美团点评回应更名为“美团”;中通快递通过港交所上市聆讯...
  4. 一周总结汇总_2016-09-18
  5. BZOJ 1006: [HNOI2008]神奇的国度( MCS )
  6. 一款可视化低代码编程平台开源了!
  7. 106.比特率和波特率
  8. 全国所有火车站(12306官方客运营业站站点)很全!!
  9. putty拷贝服务器文件,Windows下拷贝Linux的文件到本地(Putty)
  10. 记录遇到的web前端开发面试题(八股文)
  11. 书评精益创业-新创企业的成长思维 (上)
  12. 我的世界服务器java启动脚本_教程/服务器启动脚本
  13. php 红包算法教程,php仿微信红包分配算法的实现方法
  14. WIN10 开启SFTP FTP FTPS配置
  15. Eggshell笔记
  16. 软件测试之微软学术搜索(Microsoft Academic Search)
  17. 问题 F: 超超的自闭意思
  18. P2550 彩票摇奖
  19. wordpress更新php,wordpress怎么更新
  20. SVN 常见4种 无法弹出登录窗

热门文章

  1. 免费共享(第二波):2010-2020年植被覆盖度VFC年产品!
  2. Unity(初识脚本)
  3. 电脑手机都能用!影视解说月入过万,不限次数免费下载收费文案
  4. 【VisualBasicApplication】Excel编程 快速入门
  5. 【安全知识分享】PPTX|校园安全培训(26页)(附下载)
  6. 《僵尸U》免安装简体中文绿色版
  7. 青软实训.Net学习笔记
  8. 2023年上半年软件设计师上午试卷及答案
  9. 广州交警发布科目三路考秘笈
  10. NG Toolset开发笔记--5GNR Resource Grid(21)