/***************************************************************

* 文件名:hu.cpp                                              *

*                                                             *

* 功  能:演示一个简洁明了的递归函数——判断[麻将]的和牌。    *

*                                                             *

* 说  明:1.  此函数不判断七对和十三幺,读者不难自行判断;    *

*     同时由于麻将的规则各不相同,也请读者自己添加和修改。*

*                                                             *

*     2.  其他与麻将类似的游戏,如[字牌](又称跑胡子、    *

*     二七十)等牌类游戏,也可采用类似的判断函数。        *

*                                                             *

* 环  境: VC 6.0,  但符合ANSI C标准,随便移植 ^_^             *

*                                                             *

* 作  者:shyworm(怕怕虫)                                     *

* E_Mail: shyworm@sina.com                                    *

***************************************************************/

#include

int Hu(int PAI[38]);

int Remain(int PAI[38]);

int main()

{

// 把一副牌放在下面的数组里,可以任意填入数字来测试函数正确与否。

// 为了方便,PAI[0],PAI[10],PAI[20],PAI[30]都弃之不用,并且必须

// 置为0,千万注意!

int PAI[38] = { 0,

1,1,1,0,1,1,1,0,0,    // PAI[ 1- 9]  壹万~玖万的个数

0,

0,0,0,0,0,3,0,0,0,    // PAI[11-19]  壹铜~玖铜的个数

0,

0,0,0,0,0,0,0,0,0,    // PAI[21-29]  壹条~玖条的个数

0,

0,1,1,1,0,0,0         // PAI[31-37]  东南西北中发白的个数

};

// 请务必先排除“七对” 和“十三幺”,由于简单,所以不提供了

// if( QIDUI(PAI) )...

// if( SHISANYAO(PAI) )...

if( Hu(PAI) )

printf("哈!我和啦!/n");

else

printf("哎,和不成!/n");

return 1;

}

// 判断和牌的递归函数,不考虑“七对” 和“十三幺”。因为如果

// 把“七对” 和“十三幺”的判断放在递归函数里,将得不偿失。

int Hu(int PAI[38])

{

static int JIANG = 0;            // 将牌标志,即牌型“三三三三二”中的“二”

if( !Remain(PAI) ) return 1;     // 递归退出条件:如果没有剩牌,则和牌返回。

for(int i=1;!PAI[i]&&i<38;i++);  // 找到有牌的地方,i就是当前牌, PAI[i]是个数

printf("i = %d/n",i);            // 跟踪信息

// 4张组合(杠子)

if ( PAI[i] == 4 )               // 如果当前牌数等于4张

{

PAI[i] = 0;                  // 除开全部4张牌

if( Hu(PAI) ) return 1;      // 如果剩余的牌组合成功,和牌

PAI[i] = 4;                  // 否则,取消4张组合

}

// 3张组合(大对)

if ( PAI[i] >= 3 )               // 如果当前牌不少于3张

{

PAI[i] -= 3;                 // 减去3张牌

if( Hu(PAI) ) return 1;      // 如果剩余的牌组合成功,和牌

PAI[i] += 3;                 // 取消3张组合

}

// 2张组合(将牌)

if ( !JIANG && PAI[i] >= 2 )     // 如果之前没有将牌,且当前牌不少于2张

{

JIANG = 1;                   // 设置将牌标志

PAI[i] -= 2;                 // 减去2张牌

if( Hu(PAI) ) return 1;      // 如果剩余的牌组合成功,和牌

PAI[i] += 2;                 // 取消2张组合

JIANG = 0;                   // 清除将牌标志

}

if ( i > 30 )    return 0;       // “东南西北中发白”没有顺牌组合,不和

// 顺牌组合,注意是从前往后组合!

if( i%10 != 8 && i%10 != 9  &&   // 排除数值为8和9的牌

PAI[i+1] && PAI[i+2] )      // 如果后面有连续两张牌

{

PAI[i]--;

PAI[i+1]--;

PAI[i+2]--;                  // 各牌数减1

if( Hu(PAI) ) return 1;      // 如果剩余的牌组合成功,和牌

PAI[i]++;

PAI[i+1]++;

PAI[i+2]++;                  // 恢复各牌数

}

// 无法全部组合,不和!

return 0;

}

// 检查剩余牌数int Remain(int PAI[38]){    int sum = 0;    for(int i=1;i<38;i++)        sum += PAI[i];    return sum;}

C语言麻将递归,一个简洁明了的递归函数——判断[麻将]的和牌相关推荐

  1. 【C语言】输入一个整数x并判断x是否存在于数组a中

    #include<stdio.h> int main() {int x, i, a[10] = { 11,5,78,22,53,66,34,89,45 };//数组初始化printf(&q ...

  2. python语言的理解-使用Python语言理解递归

    递归 一个函数在执行过程中一次或多次调用其本身便是递归,就像是俄罗斯套娃一样,一个娃娃里包含另一个娃娃. 递归其实是程序设计语言学习过程中很快就会接触到的东西,但有关递归的理解可能还会有一些遗漏,下面 ...

  3. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...

    C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...

  4. C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

    C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈 分享到: QQ空间 新浪微博 腾讯微博 豆瓣 人人网 递归是一种强有力的技巧,但和其他技巧一样,它也可能被误用. 一般需要递归解决的问题有两个特 ...

  5. c语言编写计算ackerman函数的递归函数ack(n,x,y),第六章函数与宏定义实验报告二...

    C程序设计实验报告 实验项目: 6.4.2.2. 利用复化梯形公式计算定积分 6.4.2.3. 计算Ackerman函数 6.4.3.1. 编写计算x的y次幂的递归函数getpower(int x,i ...

  6. C语言入门——递归(思想简要讲解+简单递归练习)

    C语言入门--递归(简要讲解+递归练习) 递归定义: 程序调用自身的编程技巧称为递归( recursion). 递归从字面上我们可以理解为: 递去+归来 如下图 使用递归的目的: 简要:简化代码量,方 ...

  7. c语言字符串递归例子,c语言函数递归(简单的递归例子c语言)

    若在main函数中调用hanoi(3,'A','B','c')运行结果 void move(char getone,char . 分成三组: (一), 目的:将1号和2号从A移到B 调用函数:hano ...

  8. python 递归 写平方_Python递归函数如何写?正确的Python递归函数用法

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是 ...

  9. 统计c语言中英文字幕,C语言日记——递归

    C语言日记--递归 首先,允许我从<c primer plus>中摘一句话:C允许函数调用它自己,这种调用称为递归. 有一段时间一直搞不清楚递归的实质,直到看到如下代码: #include ...

  10. 122345 java_【每天算法2】:用java语言实现,一个组数:122345这6个数,打印出它所有可能的组合;要求4不能在第3位,3和5不能相连。 | 学步园...

    一个组数:122345这6个数,打印出它所有可能的组合:要求4不能在第3位,3和5不能相连. 我在实现这个 感觉我的算法复杂度还是挺高的.过程中,不断的创建新的数组列别. 如果你有更好的算法,请发上来 ...

最新文章

  1. 事件绑定在IE下this是window的问题
  2. python实现文件下载-Python 实现文件下载
  3. 2019年计算机一级考试pdf,2019年计算机一级考试试题与答案.pdf
  4. Traefik访问master节点不通的问题定位
  5. java 阻塞 wait_java交替打印奇偶数问题,会出现2个线程都wait阻塞了
  6. matlab插值与拟合例题_菜鸟进阶系列:MATLAB数学建模·数据插值与拟合
  7. 一些常用正则表达式片段的分析
  8. python123-Python123
  9. NumPy 简单应用
  10. Python垃圾回收机制:gc模块
  11. BZOJ2160 拉拉队排练
  12. 数字逻辑电路期末复习与常见问题
  13. IC-二进制, 自然数, 有符号数
  14. 面试官:你在平时的工作中遇到过哪些问题让你印象深刻?
  15. 计算机ppt制作培训心得,PPT课件制作及微课录制心得
  16. linux酒吧消费,Handpick x HK I 深夜霓虹燈下的迷幻酒吧
  17. matlab单双极性眼图程序,求通信大神讲讲这个matlab程序每一段的意思
  18. 美国研究生统计学专业申请及就业情况浅析
  19. 数字电子技术实验作业(10)
  20. u盘里的文件删除了怎么恢复

热门文章

  1. excel表格如何不需鼠标往下拖动而自动往下填
  2. 移动硬盘 RAW修复
  3. 关于SVN无法cleanup的问题
  4. MongoDB实战(MongoDB开发者现身说法)
  5. S=A-BIS-dS+u2w2I+u1w1E数模作业
  6. HONOR Magicbook 进不了系统
  7. 2022 Google IO大会新技术
  8. 编程把系统窗口背景颜色设置成护眼的淡绿色
  9. Javascript使用三大家族和事件来DIY动画效果相关笔记(六)
  10. Arcmap做地形地貌图流程