这个程序的缘由是看到朋友圈里发布了这么一张图:

我是个斗地主菜鸟啊,反正一时半会是没看出来到底谁能赢,但是我对这类问题倒是很有兴趣,真好我那阵也写过几个类似这种动态规划算法的程序,于是我开发了一个小软件来计算题目所述的情况下到底是谁必赢,而且还可以修改能出什么牌的规则,如下图:

难点是出牌规则这块,不过最后还是克服了,算出来的结果是地主赢,网上搜了一下答案,符合。当然除了程序猿,一般人很难理解,就打个牌还用弄程序算?我自己看看不就知道谁赢了吗,但是程序的好处嘛就是只要你算法是对的,遇到再多这种类似的问题都是一样解决啊,而且不会出错,秒杀解决。

这不,今年过年在QQ群里又遇到这么一个类似的题目,如下:

在群里还在争论不休的时候,我拿出程序一算,搞定,如下图:

我想结果应该是没错吧,后来我就随便看了看源码(VC写的,IDE是VS2005),突然想起来,我有没有把“过”也算到应对的可能里去啊,找找,发现还是有的,放心了,看来当时还是用心的,哈哈。

019-04-22修正:

这两天我又在头条上看到这种题目,我当然要再算一下了,我下巴都掉了,居然错了,纳尼。。。怎么会算错了呢,我敬了个呆,没办法,只好把算法和代码都理了一遍,发现递归主算法没有问题,问题是出在一个比较牌型大小的函数,因为2比较特殊,作为单牌是除了大小鬼最大的,但是作为比如连对,飞机这种,2又是较小的(甚至规则允许不允许也是个问题),就是这个判断的有问题,修复了之后再算是对的,我又把这篇文章里的两道都算了一下,发现第一道3 3 3 3 4 5 6 7 j j  2 2 2 2 竟然使用了2 3 4 5 6 7这种走法,算出来农民赢,额。。。这是从一个侧面证明了我这个程序是正确的嘛。。我略一攻防,好像这么走的确是农民赢啊,如果把顺子这种规则去掉就是地主赢,看来的确顺子有没有带2不一样,所以这样就归结到了规则是怎么规定的。然后又发现我这篇里第二个例子,农民的牌弄错了,小鬼打成了q,我重新算了一下,无论是g还是q,结果是一样的,第二个例子还好,可能碰巧对了。

最后再mark一下递归主程序的逻辑

//2019-04-22:函数的作用是 - 给定农民的牌,地主的牌,当前轮到谁了,上一手牌是什么,算出谁必赢
ePlayResult CsrcDlg::playCards(int depth, const vector<int>& farmer, const vector<int>& landlord, bool fmr_turn, const CCard& cur_card)

为了算谁赢,我可以遍历当前选手的可选出牌方法,如果有一种出牌方法可以得出他必赢,则在当前局面下,该选手必赢,如果一种方法都不能必赢,则他此局面必输。递归就在于遍历出牌方法时,判断使用此方法后形成的新局面谁必赢,使用的还是这个函数,也就是递归了。

看了自己写的这个c代码,有点糟,主要是手法不够老道,需要理解的东西太多,没有做一定的控制。另外c++的写法也实在太冗余了,看了不舒服,IDE也不行。

最后给个下载地址:一个计算斗地主谁必赢谁必输的程序.zip

2019-04-22修正版:https://pan.baidu.com/s/1d0a70gfZcE0sdtrkDBHlmw  提取码:wsjw

【原创】一个计算斗地主谁必赢谁必输的程序相关推荐

  1. Java黑皮书课后题第6章:*6.15(金融应用:打印税表)程序清单3-5给出了计算税款的程序。使用下面的方法体编写一个计算税款的方法。使用这个方法编写程序,打印可征税人从50000到60000间隔

    *6.15(金融应用:打印税表)程序清单3-5给出了计算税款的程序.使用下面的方法体编写一个计算税款的方法.使用这个方法编写程序 题目 题目描述 破题 程序清单3-5(非本题):代码不全 补充代码:编 ...

  2. 打麻将必胜绝技(珍藏版,逢赌必赢)

    打麻将必胜绝技(珍藏版,逢赌必赢)          打麻将必胜绝技(珍藏版,逢赌必赢)(上)         1.147,258规则:下家丢1万,3.4.7万基本不吃,2.5万可能要吃: 2.牌过半 ...

  3. BEM战略解码的核心是打赢必赢之战

    战略制定的过程包括了战略规划和战略解码,在<BLM战略规划的核心是业务模式创新>一文中,樊辉老师为大家展示了运用BLM(业务领先模型)设计业务模式的工具和方法,在接下来的这篇文章中,我们来 ...

  4. python自定义函数求差_[VBA]发布一个计算桩号之差的Excel自定义函数(VBA)

    这是一个可以计算桩号之差(也就是得到长度)的Excel(或WPS)扩展函数,可以减少工程师在统计工程量时的工作量. 该函数具有一定的通用性.可以在MS Office和金山WPS上使用. 文末会给出使用 ...

  5. 赌徒都应该明白的道理:通过简单计算告诉你为什么久赌必输

    今天在知乎看到一个有趣的话题,"假设赌博输赢的概率都是50%,那么长期赌博的人为什么仍然会更容易倾家荡产而不是收益均衡?" 问:即使绝对公平的赌局(50%赢,50%输),赌到最后, ...

  6. Java黑皮书课后题第10章:***10.8(金融:Tax类)编程练习题8.12使用数组编写一个计算税款的程序。设计一个名为Tax类,该类包含下面的实例数据域

    ***10.8(金融:Tax类)编程练习题8.12使用数组编写一个计算税款的程序.设计一个名为Tax类,该类包含下面的实例数据域 题目 程序解释 代码 Test8.java Test8_Tax.jav ...

  7. Java黑皮书课后题第3章:3.10(游戏:加法测试)程序清单3-3随机产生一个减法问题。修改这个程序,随机产生一个计算两个小于100的整数的加法问题

    3.10(游戏:加法测试)程序清单3-3随机产生一个减法问题.修改这个程序,随机产生一个计算两个小于100的整数的加法问题 题目 题目概述 参考:程序清单3-3 代码 题目 题目概述 3.10(游戏: ...

  8. java编写算术平均数,[求助]基础-怎样编一个计算算术平均数的程序(急啊)

    [求助]基础-怎样编一个计算算术平均数的程序(急啊) 刚刚开始学习JAVA,不好意思 明天就要交作业了,还是编不出 高手帮忙吧 题目:编写一个计算随意多少个数的算术平均数的程序 首先要有一个对话框,可 ...

  9. golang | 使用goroutine和channel实现一个计算int64随机数各位数和的程序。

    文章目录 能不能不用结构体写 程序 能不能不用结构体写 关键点没想明白,做个记录. 使用goroutine和channel实现一个计算int64随机数各位数和的程序. 程序 package maini ...

最新文章

  1. Matlab生成Xilinx Rom IP CORE的初始化内容coe文件
  2. [翻译] Qt QFtp功能无法被Qt 5 Network系列模块替代的说明
  3. php 仓储 sqlite_详解php封装db类连接sqlite3
  4. java根据ip查计算机名_Java如何从IP地址查找主机名?
  5. 软件发布的版本缩写含义RC 、RTM
  6. python中str如何使用_python中str函数的使用方法
  7. 将excel文档转为word文档的方法
  8. 【图像去噪】基于BM3D算法实现图像去噪含Matlab源码
  9. 【U8】用友U8一张A4纸打印一张凭证设置
  10. C语言 矩阵相似度
  11. 专家看台:盛大架构师周爱民回顾职业历程,分享十项建议
  12. PS 把两张图片融合为一张
  13. 自然数学-自然常数e
  14. java 过滤微信昵称_java过滤微信昵称emoji表情与非emoji的问题解决方法
  15. MySQL第41题怎么评分_MYSQL练习题54道(包含尽可能多的解决方法及思路)
  16. 复数的幅角Arg与幅角主值arg
  17. 完美解决SyntaxError: import * only allowed at module level
  18. 小技巧,不积硅步无以至千里
  19. Premiere 2.0至Premiere CS5.5高清插件MainConcept(已破解)提供115网盘下载地址
  20. 从源代码获取视频和封面图

热门文章

  1. 揭秘:一篇文章揭穿创业公司的套路
  2. java 实现用户每天一次签到功能
  3. (已解决)win10系统cortana小娜无法连接网络,其他程序可正常联网
  4. 解决软件安装出现乱码
  5. 如何用html + css 绘制Google logo
  6. Ubuntu22.04安装VMware16[解决各种安装问题]
  7. 海康威视网络摄像头检测红外激光点的正确配置
  8. 妖人柴:破零拐点:打破网络赚钱的魔咒
  9. 日语计算机客服客服常用敬语,日语常用敬语问候语
  10. Android基础入门教程——2.2.3 TableLayout(表格布局)