代碼地址
git地址:https://coding.net/u/mich/p/easytry/git/tree/master/src/com/card
背景
身邊朋友在做棋牌,所以就自己嘗試了用java來實現查看手上一副撲克牌可以有多少種排列組合(只是按照出牌的思路,並不是最優解,可補充)。
實例
話不多說,先看看最后的調用以及實現結果,由於數據組合太多,就不一一截圖了
public static void main(String[] args) { Cards cards = new Cards(); cards.setCards(new int[]{1, 2, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 11, 11, 12}); List<HandCards> allHands = new ExtractUtil().extract(cards); for (HandCards allHand : allHands) { System.out.println(allHand.getHandCards()); } }
主要思路
先將手上的牌正序排序,從最小那張牌開始,尋找所有包含這張牌的組合,獲取之后(最差就是只有這一張,所以一定是可以提取出的)將這組合放到一個隊列中,將剩下的牌繼續提取,直至沒有手牌。代碼實現的主要思路還是遞歸。(再次聲明,此方法不是最優解,只是提供一種思路和方式)
主要由以下幾部分組成:
- 牌Cards
- 手牌HandCards
- 牌組合接口IExtract(通過接口將符合組合的所有結果提取出來,更利於以后調整)
- 結構ExtractResult
目錄結構如下