關於麻將的算法構想

麻將牌型主是AA,AAA,AAAA,ABC的組合構成胡牌,可以把牌分爲明牌和手牌,明牌是指槓,喫,碰之後的牌,手牌指未露出來的牌,聽牌只需要算手牌即可。

聽牌可以分爲有對將,其它爲圓句,只留一個需要圓句,喫牌胡,或者碰牌胡。

如果無對將,則需所有爲圓句和一張單牌吊將。

 

方法一:

先取一對將,再把剩下的牌遞歸找整句,直到只剩兩張牌,算出缺口牌即爲聽的牌。中間任意一步失敗也該組合失敗。

先找整句,剩下的牌再找整句,如此遞歸,只到只剩一張,此牌爲聽牌。任意一步失敗該組合也失敗。

算法缺陷:重複的組合很多,例如AAABBBC,BBBAAAC其實是一樣的,卻重複遞歸計算了。

方法二:

思路大體上與方法一一樣,改進點就是要減少重複的組合,找到所有的對,句去組合,再判斷。

算法缺陷:所有的對,句組合(cmn)時往往會也有少量重複計算,原因是句,對會有交叉,另外還要計算交叉組合是否與原牌相符合,計算量也不小。在多數情況下計算量還是要好於方法一。

以上兩種算法均已js實現。

如何處理交叉問題,減少無效組合計算?這確實有點難度,待深度思考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章