期末考试期间,看见某网站有这么一道编程的题目,说是要做一个判断是否胡牌的程序.
我挺喜欢麻将的,虽然很少打,但也会想做一个麻将的程序.故此先研究一下其中的算法吧.
题目基本是这样的,编写一个判断是否能胡牌的程序,各种牌分别是
条子是 0x01到0x09
筒子是 0x11到0x19
万子是 0x21到0x29
东南西北分别是0x30,0x40,0x50,0x60
中发白分别是0x70,0x80,0x90
百搭牌是0x00
其中百搭就是我们常说的"卉儿",万能牌.同时,这里有条规则,白板要代替成为百搭牌的那种牌.(咱也不知道是哪个非洲国家的玩法...)
我的基本思路很简单,一般的回溯算法,首先寻找对子,再找三个的顺或刻,如果其中一步一旦寻找不到,就回溯到重新执行上一步的更正,知道某一种搭配方式可以达到即中断或者到最后都没有合适的即结束.
这里有两个问题,一是中途判断是否为顺或者刻及其相应工作很复杂,特别是当以一个百搭为基准(指有了此牌后找相应的两个其他牌)进行寻找时更是无从下手,我于是便先用快速排序把牌进行从大到小的排列.这样一来不但百搭永远不可能成为基准牌,而且对顺或刻的寻找也方便了很多.真是一举多得.
还有就是此例仍然使用了很多变量和数组,我定义数组b来作为一个类似回溯时候的栈,k作为控制,一旦本次寻找失败,好能找到上次的数据,再此基础修改重做.还有c标志位.可读性仍然是这么差.
程序如下:
#include <stdio.h>
#include <stdlib.h>
#de