关于麻将的算法构想
麻将牌型主是AA,AAA,AAAA,ABC的组合构成胡牌,可以把牌分为明牌和手牌,明牌是指杠,吃,碰之后的牌,手牌指未露出来的牌,听牌只需要算手牌即可。
听牌可以分为有对将,其它为圆句,只留一个需要圆句,吃牌胡,或者碰牌胡。
如果无对将,则需所有为圆句和一张单牌吊将。
方法一:
先取一对将,再把剩下的牌递归找整句,直到只剩两张牌,算出缺口牌即为听的牌。中间任意一步失败也该组合失败。
先找整句,剩下的牌再找整句,如此递归,只到只剩一张,此牌为听牌。任意一步失败该组合也失败。
算法缺陷:重复的组合很多,例如AAABBBC,BBBAAAC其实是一样的,却重复递归计算了。
方法二:
思路大体上与方法一一样,改进点就是要减少重复的组合,找到所有的对,句去组合,再判断。
算法缺陷:所有的对,句组合(cmn)时往往会也有少量重复计算,原因是句,对会有交叉,另外还要计算交叉组合是否与原牌相符合,计算量也不小。在多数情况下计算量还是要好于方法一。
以上两种算法均已js实现。
如何处理交叉问题,减少无效组合计算?这确实有点难度,待深度思考。