C语言麻将递归,C++数据结构与算法——麻将胡牌算法(二:完全胡牌算法)
雖然單花色胡牌算法面試時寫出來了,但是完整的胡牌算法卻沒有寫,既然遇到了,秉著不拋棄不放棄的精神,當然不能原諒懶惰的自己了。下面這篇為一個完整的胡牌算法。
胡牌規則除了以下幾點,其余與單花色胡牌規則一致:
1.東南西北中發,只能三個相同的牌才能進行組合,不允許與不同的牌進行組合
2.牌的花色可能有多種
分析:
這里由于涉及到多花色的情況,我們可以將它當作是單花色的一個擴展。即,只要從牌中取出一對將牌后,將剩余的牌按照花色分別判斷是否符合規則即可。其中judgeLeft函數為單花色中使用的函數。代碼如下:enum?eHuaseType
{
EN_WANZI?=?0,???//?萬字
EN_TIAOZI,??????//?條字
EN_BINGZI,??????//?餅字
EN_FENG,????????//?風
EN_HUASE_COUNT??//?花色的種類數};#define?MAX_LENGTH_OF_HUASE?(10)//?多申請一些內存,方便取值//?假定牌對應的數字如下:1~9為萬字,11~19為條字,21~29為餅字,31~37為東南西北中發白bool?judgeLeftHuase(int?*arr,?int?len,?eHuaseType?etype)
{????//?如果是萬、條、餅,則按照單花色判斷
if?(etype?
{????????return?judgeLeft(arr,?len);
}????//?如果是東南西北中發白,則判斷是否是3個相同的牌
for?(int?i?=?0;?i?
{????????if?(arr[i]?==?0)
{????????????continue;
}????????if?(arr[i]?!=?3)
{????????????return?false;
}
}????return?true;
}bool?completeHupai(int?*arr,?int?len)
{????if?(len?
{????????return?false;//?牌的長度小于5,或者去除將牌后,長度不是三的倍數
}????int?atrans[EN_HUASE_COUNT][MAX_LENGTH_OF_HUASE];????int?atmps[EN_HUASE_COUNT][MAX_LENGTH_OF_HUASE];????memset(atrans,?0,?sizeof(atrans));
eHuaseType?eType?=?EN_HUASE_COUNT;????for?(int?i?=?0;i?
{
eType?=?(eHuaseType)(arr[i]?/?MAX_LENGTH_OF_HUASE);?????????????//??取牌的類型
atrans[eType][arr[i]?-?1?-?eType?*10]++;????????????????????????//??將出現的牌進行次數累計
}????//?遍歷?atrans?進行取將
for?(int?i?=?0;i?
{????????memcpy(atmps,?atrans,?sizeof(atrans));????????if?(atmps[i/?MAX_LENGTH_OF_HUASE][i%MAX_LENGTH_OF_HUASE]?
{????????????continue;
}
atmps[i?/?MAX_LENGTH_OF_HUASE][i?%?10]?-=?2;????????//?取將完成,判斷剩余的牌是否符合規則
for?(int?j?=?0;j?
{????????????//?如果不符合規則,則重新取將
if?(!judgeLeftHuase(atmps[j],MAX_LENGTH_OF_HUASE,j))
{????????????????break;
}????????????//?如果所有的花色都判斷OK,則這副牌可以胡
if?(j?==?EN_HUASE_COUNT?-?1)
{????????????????return?true;
}
}
}????return?false;
}
總結
以上是生活随笔為你收集整理的C语言麻将递归,C++数据结构与算法——麻将胡牌算法(二:完全胡牌算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux bash source 0,
- 下一篇: 啊哈c语言推箱子小游戏,啊哈C入门版学完