麻将的小程序 2006-07-18

本文介绍了作者通过编程实现麻将胡牌算法的过程,包括利用回溯算法寻找对子、顺子或刻子,并通过快速排序优化查找。代码示例中包含了核心的检查、查找和排序函数,但作者指出仍有优化空间,期待读者反馈错误。
摘要由CSDN通过智能技术生成

  期末考试期间,看见某网站有这么一道编程的题目,说是要做一个判断是否胡牌的程序.

  我挺喜欢麻将的,虽然很少打,但也会想做一个麻将的程序.故此先研究一下其中的算法吧.

  题目基本是这样的,编写一个判断是否能胡牌的程序,各种牌分别是

条子是 0x01到0x09
筒子是 0x11到0x19
万子是 0x21到0x29
东南西北分别是0x30,0x40,0x50,0x60
中发白分别是0x70,0x80,0x90
百搭牌是0x00

 其中百搭就是我们常说的"卉儿",万能牌.同时,这里有条规则,白板要代替成为百搭牌的那种牌.(咱也不知道是哪个非洲国家的玩法...)

 我的基本思路很简单,一般的回溯算法,首先寻找对子,再找三个的顺或刻,如果其中一步一旦寻找不到,就回溯到重新执行上一步的更正,知道某一种搭配方式可以达到即中断或者到最后都没有合适的即结束.

 这里有两个问题,一是中途判断是否为顺或者刻及其相应工作很复杂,特别是当以一个百搭为基准(指有了此牌后找相应的两个其他牌)进行寻找时更是无从下手,我于是便先用快速排序把牌进行从大到小的排列.这样一来不但百搭永远不可能成为基准牌,而且对顺或刻的寻找也方便了很多.真是一举多得.

还有就是此例仍然使用了很多变量和数组,我定义数组b来作为一个类似回溯时候的栈,k作为控制,一旦本次寻找失败,好能找到上次的数据,再此基础修改重做.还有c标志位.可读性仍然是这么差.

程序如下:

#include <stdio.h>
#include <stdlib.h>
#de

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值