十三水规则:二到四人对局,,一副牌,除去大王,小王,剩下总共52张牌;游戏中每人获得13张牌;
游戏规则每位玩家需将手上的13张牌分成头、中、尾三墩牌,头墩三张,中尾墩各五张。2)  普通牌型(3、5张牌)同花顺:同门花色中之五张连续牌。若别家也有同花顺时,比顺子大小如牌型全部相同,则平局。 在底墩,按5道计;在中墩,则记10道;铁支(四条):4张相同的牌。在底墩,按4道计;在中墩,则记8道;葫芦:由三条加一对组成。若别家也有此牌型,则比三张数字大小。 放中墩,则计3道;同花:同门花色中之五张杂牌。若遇相同则先比这副牌中最大的一支,如又相同再比第二支、依此类推。如牌型全部相同则平局;顺子:五张牌都是连续的组合,2、3、4、5、6为最小牌。 10、J、Q、K、A为最大牌,若巧遇别家也有则平局。道:第二大的牌不是9、10、J、Q、K(此为第三大)而是A、2、3、4、5;三条:三张相同的牌。若遇相同,则比三条部分的数字大小。 在头墩,以三尖刀计;三尖刀:头墩为三条。 按3道计。二对:牌型中五张牌由两组两张相同数字的牌所组成。若遇相同则先比这副牌中最大的一对,如又相同再比第二对、如又相同再比单张牌大小。如牌型全部相同则平局。对子:由两张相同数字的牌组成。若别家也相同则比剩下牌的数字大小,如牌型全部相同则平局。 第一墩是两张带一张,后面是两张带三张;乌龙(散牌):组不出任何牌型。只比数字大小,其比法与同花相同。若两家从大到小都一样,则平局;

规则介绍:
https://baike.baidu.com/item/%E5%8D%81%E4%B8%89%E6%B0%B4/81938

后台逻辑实现思路:
一手牌是13张,要组成头墩、中墩、尾墩,每墩可能分别是同花顺、铁枝……对子、乌龙等,要保证尾墩 >= 中墩 > 头墩。可以通过遍历所有类型,获取指定的尾墩组合后,对剩余的牌再进行组合,优先使用递归。
伪代码:

// CCombinateCards 组合类
// ST_ONE_HAND_COMBINATION 一手牌组合
// ST_CARD_SENTENCE 一墩牌,三张或五张
typedef std::vector<ST_ONE_HAND_COMBINATION> COneHandArray;bool CCombinateCards::CombinateSpecifiedStyle(COneHandArray &arrTraverseArray,BYTE byType)
{CCombinateCards clsGroup = *this;   if (clsGroup.m_nCount == 0){return true;}int iStcTypeCount = 0;int iSentence = 0;int iPos = clsGroup.m_nCount / MAX_SENTENCE_LENGTH;                 // 头、中、尾int iLength = iPos == EN_LOCALTION_HEAD? MIN_SENTENCE_LENGTH : MAX_SENTENCE_LENGTH;bool bTail = clsGroup.m_nCount == MAX_CARDS_EVERYONE;std::vector<ST_CARD_SENTENCE> arrSentence;if (byType >= EN_ST_TONGHUASHUN && m_nCount >= MAX_SENTENCE_LENGTH){int iTonghuashunCount = NormalTonghuashun(arrSentence);if (byType == EN_ST_TONGHUASHUN && bTail && iTonghuashunCount == 0){return false;}for (;iSentence < iTonghuashunCount;++iSentence)    // 如果有同花顺,则将该顺子从手牌中删除,拼凑头和中{CCombinateCards clsGroupTmp = clsGroup;if (!clsGroupTmp.DeleteSentence(arrSentence[iSentence],iLength))        // 删除该句子,获得剩余的牌{return false;}if (bTail)                      // 如果是尾墩,应该新建一个 ST_ONE_HAND_CARD ,如果是中或头,则往 arrTraverseArray 的最后一个 ST_ONE_HAND_CARD 中添加{ST_ONE_HAND_COMBINATION stOneHand;stOneHand.SetLocationCard(EN_LOCALTION_TAIL,arrSentence[iSentence]);arrTraverseArray.push_back(stOneHand);}else{// 如果是取中墩,且已经有一个中墩了,再新建一个 ST_ONE_HAND_COMBINATION ,尾墩不需要新建。如果是尾墩则直接往 arrTraverseArray 里面设置if (iPos == EN_LOCALTION_MID && arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_MID].IsValidSentence()){ST_ONE_HAND_COMBINATION stOneHand;stOneHand.m_astSentence[EN_LOCALTION_TAIL] = arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_TAIL];arrTraverseArray.push_back(stOneHand);}arrTraverseArray[arrTraverseArray.size() - 1].SetLocationCard(iPos,arrSentence[iSentence]);                 }clsGroupTmp.CombinateSpecifiedStyle(arrTraverseArray,EN_ST_TONGHUASHUN);                                        // 此处获得的是以同花顺为尾墩的组合}if (iTonghuashunCount > 0 && bTail){return true;}}if (byType >= EN_ST_TIEZHI){int iTiezhiCount = NormalTiezhi(arrSentence);                                           // 到这里肯定没有同花顺了,此时从剩余的单牌中找一个放入 arrSentence 中if (byType == EN_ST_TIEZHI && bTail && iTiezhiCount == 0){return false;}for (iSentence = 0;iSentence < iTiezhiCount;++iSentence)                                // 如果有铁枝,则将该铁枝从手牌中删除,拼凑头和中{CCombinateCards clsGroupTmp = clsGroup;if (!clsGroupTmp.DeleteSentence(arrSentence[iSentence],arrSentence[iSentence].m_iSentenceLen))      // 删除该句子,获得剩余的牌{return false;}if (bTail)                      // 如果是尾墩,应该新建一个 ST_ONE_HAND_CARD ,如果是中或头,则往 arrTraverseArray 的最后一个 ST_ONE_HAND_CARD 中添加{ST_ONE_HAND_COMBINATION stOneHand;stOneHand.SetLocationCard(EN_LOCALTION_TAIL,arrSentence[iSentence]);arrTraverseArray.push_back(stOneHand);}else{// 如果是取中墩,且已经有一个中墩了,再新建一个 ST_ONE_HAND_COMBINATION ,尾墩不需要新建。如果是尾墩则直接往 arrTraverseArray 里面设置if (iPos == EN_LOCALTION_MID && arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_MID].IsValidSentence()){ST_ONE_HAND_COMBINATION stOneHand;stOneHand.m_astSentence[EN_LOCALTION_TAIL] = arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_TAIL];arrTraverseArray.push_back(stOneHand);}arrTraverseArray[arrTraverseArray.size() - 1].SetLocationCard(iPos,arrSentence[iSentence]);}clsGroupTmp.CombinateSpecifiedStyle(arrTraverseArray,EN_ST_TIEZHI);                                         // 此处是以铁枝为尾墩的组合}if (iTiezhiCount > 0  && bTail){return true;}}// 中间其他类型省略 ...int iWulongCount = NormalWulong(arrSentence);//if (byType == EN_ST_WULONG/* && bTail */&& iWulongCount == 0)                             // 乌龙不会出现在尾墩//{//  return false;//}for (iSentence = 0;iSentence < iWulongCount;++iSentence)                                    // 如果有葫芦,则将该葫芦从手牌中删除,拼凑头和中{CCombinateCards clsGroupTmp = clsGroup;if (!clsGroupTmp.DeleteSentence(arrSentence[iSentence],iLength))        // 删除该句子,获得剩余的牌{return false;}if (bTail)                      // 如果是尾墩,应该新建一个 ST_ONE_HAND_CARD ,如果是中或头,则往 arrTraverseArray 的最后一个 ST_ONE_HAND_CARD 中添加{ST_ONE_HAND_COMBINATION stOneHand;stOneHand.SetLocationCard(EN_LOCALTION_TAIL,arrSentence[iSentence]);arrTraverseArray.push_back(stOneHand);}else{// 如果是取中墩,且已经有一个中墩了,再新建一个 ST_ONE_HAND_COMBINATION ,尾墩不需要新建。如果是尾墩则直接往 arrTraverseArray 里面设置if (iPos == EN_LOCALTION_MID && arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_MID].IsValidSentence()){ST_ONE_HAND_COMBINATION stOneHand;stOneHand.m_astSentence[EN_LOCALTION_TAIL] = arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_TAIL];arrTraverseArray.push_back(stOneHand);}arrTraverseArray[arrTraverseArray.size() - 1].SetLocationCard(iPos,arrSentence[iSentence]);}clsGroupTmp.CombinateSpecifiedStyle(arrTraverseArray,EN_ST_WULONG);                                         // }return true;
}

十三张/十三水 最优组合相关推荐

  1. 癞子版本十三张自动摆牌算法

    癞子十三张自动摆牌算法横空出世,早两个月之前发布了非癞子版本十三张摆牌算法,那时候觉得癞子版本很复杂,没有深入研究.后面应粉丝要求出一个癞子版本的试试效果,经过一个月研究,成熟稳定的癞子算法终于完成. ...

  2. R语言使用ggpubr包的ggarrange函数组合多张结论图(垂直组合+水平组合)并对图像进行顺序编码A、B、C,,,

    R语言使用ggpubr包的ggarrange函数组合多张结论图(垂直组合+水平组合)并对图像进行顺序编码A.B.C,,, 目录

  3. 【量化交易】组合优化三部曲:换手率和alpha模型换手约束下的最优模型时变IC下的多空/多头最优组合换手率

    前言 单因子模型,考虑策略风险(即IC时序波动),最大化风险调整后收益的主动增强组合优化 01 无约束下,多空最优组合的换手率的解析解 02 跟踪误差约束下,多头最优组合的换手率的数值优化 03 跟踪 ...

  4. 哒螨灵使用注意事项_杀螨最优组合,老的、少的、没出生的,都管用

    说到螨类害虫,很多人都会感到头疼.这东西看着小,危害却很大.在叶片上吸食汁液,导致叶绿素破坏,光合作用受阻,产量没有源头保证.要是让它上果了,更是会破坏果皮完整,影响卖相.杀螨工作年年谈.年年重治,但 ...

  5. c语言扑克牌随机发三张牌,扑克牌发三张概率组合一副扑克牌52张(不含大、小王),发三张牌,一共多少种组合.另外:1)三张中含一对的组合有多少张?(...

    共回答了20个问题采纳率:95% 这个题目我喜欢 所有组合为:C(52,5) 1.A组为三张不关联明牌,组合:52*48*44,与B组二张暗牌组成一个对子.B的组合为:(12-3)*(52-12).概 ...

  6. 基于MATLAB/yalmip/cplex 的机组最优组合

    文章目录 一.绪论 1.研究目的 2.背景概述 二.机组组合优化数学模型 2.1.问题分析 2.2.符号说明 2.3.模型建立 2.4.模型简化 三.算例介绍 总结 一.绪论 1.研究目的 (1).熟 ...

  7. 基于MATLABCPLEX 的机组最优组合,成功求解表格化,图示化的机组组合结果(学习参考)

    背景概述 MATLAB是是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,是科研中不可缺少的建模工具. IBM CPLEX ...

  8. python 组合优化 回撤最小_Python进阶量化交易专栏场外篇23-Markowitz实现股票最优组合...

    欢迎大家订阅<教你用 Python 进阶量化交易>专栏!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外已陆续推出一些手记来辅助同学们学习本专栏内容,目前推出的扩展篇链接如下: 股票 ...

  9. Matlab程序代码,智能微电网PSO优化算法,多目标调度,粒子群算法,综合能源系统优化,机组最优组合,光伏出力预测

    Matlab程序代码,智能微电网PSO优化算法,多目标调度,粒子群算法,综合能源系统优化,机组最优组合,光伏出力预测,神经网络简单应用,多目标优化,冷热电联供型综合能源系统优化调度模型,求解采用的是M ...

最新文章

  1. rapidxml修改节点的值
  2. 构建根文件系统之busybox(二)编译
  3. 00018计算机应用基础2019年4月,2019年4月自考计算机应用基础考前试题和答案00018.pdf...
  4. 结巴分词优点_中文分词概述及结巴分词原理
  5. 【New】简•导航 正式上线
  6. 如何产生cpk图形_如何正确选择三坐标测量机测头
  7. 《软件工程》第四次作业--目标软件(必应词典)
  8. 识别速度3.6ms/帧!人像抠图、工业质检、遥感识别,用这一个分割模型就够了...
  9. MFC对COM接口编写的支持分析
  10. [译] iOS 11:机器学习人人有份
  11. 制作纯净版WinPE2.0
  12. NC单据模板公式(6大类)
  13. 那些想上天的亿万富翁,开启了新的“太空竞赛”
  14. 解决Mac自动切换输入法
  15. java实现高清图片剪切
  16. Halide-based IR和 Polyhedral-based IR
  17. 十大在线编程学习网站
  18. UE4 DataAsset 的使用
  19. [网络安全学习篇60]:文件上传
  20. Git使用 从入门到入土 收藏吃灰系列 (九) git reset 移除暂存区与版本回退

热门文章

  1. HCIP——交换综合实验
  2. 物联网APP:使用android studio实现阿里云物联网平台数字签名(Signature)(附源代码)
  3. Weblogic10.3_Windows优化设置
  4. Yamale Python 包受高危的代码执行漏洞影响
  5. Octomap论文解读与ORBSLAM2应用
  6. 合金工具钢尺寸、外形及允许偏差
  7. 静脉输液的安全管理PPT模板
  8. 【JAVA】读取excel导入数据库,形成树状结构
  9. 如何编辑出一篇漂亮的微信公众号文章
  10. 向量几何在游戏编程中的使用2