十三水最優組合問題快速運算求解方案

十三水共發13張牌,要求組成3道牌,首道3張,中道5張,尾道5張.

牌型:首道:單張<一對(有2張一樣)<三條(3張大小一樣),中道和尾道:高牌<一對<兩對<三張<順子<同花<葫蘆<炸彈<同花順(9)<五同(10)

出牌需把牌理爲3道,必須尾道>=中道>=首道

 

自動擺牌方案:首先提取尾道,(剩下的牌)提取中道,(剩下的牌)首道.

提取尾道方案:先從五同開始從大到小找,找N階(找出最大的牌型的個數)

提取中道方案:從跟首道一樣大的牌型開始從大到小找,找2階(爲什麼只找2階?因爲可能存在牌型一樣大的解,如果牌型一樣大的找不到,找牌型小一點的解,再小沒必要了)

 

僞代碼實現:

    public class CardModel
    {
        public List<TypeCard> TypeCardList;
        public CardModel()
        {
            TypeCardList = new List<TypeCard>();
        }
    }

    public class TypeCard
    {
        public long Weight { internal set; get; }//牌型權重比較值
        public List<int> CardList { internal set; get; }//手牌
        public bool IsFalse { internal set; get; }
    }
 public static List<CardModel> GetAllResult(List<int> cardList)
        {
            List<CardModel> models = new List<CardModel>();
            var cardTypeList = GetAllCardType(cardList, 10, 2);
            foreach (var item in cardTypeList)
            {
                List<int> newCardlist = new List<int>(cardList);
                DeleteListElement(newCardlist, item.CardList);
                var cardTypeList2 = GetAllCardType(newCardlist, (int)(item.Weight / Math.Pow(10, 10)), 2);
                foreach (var item2 in cardTypeList2)
                {
                    if (item.Weight >= item2.Weight)
                    {
                        List<int> lastCardlist = new List<int>(newCardlist);
                        DeleteListElement(lastCardlist, item2.CardList);
                        var weight = GetCardWeight(lastCardlist);
                        if (item2.Weight >= weight)
                        {
                            var model = new CardModel();
                            model.TypeCardList.Add(item);
                            model.TypeCardList.Add(item2);
                            model.TypeCardList.Add(new TypeCard() { CardList = lastCardlist, Weight = weight });
                            models.Add(model);
                        }
                    }
                }
            }
            return models;
        }

public static List<TypeCard> GetAllCardType(List<int> cardList, int level, int depth)
        {
            List<TypeCard> typeCardList = new List<TypeCard>();

            //從大到小排序
            SortCard(cardList);

int kingCount = cardList.Count(c => c == SmallKing || c == BigKing);

            

            Action<int, Func<List<TypeCard>>> func = (cur, method) =>
            {
                if (level == cur)
                {
                    if (depth > 0)
                    {
                        var list = method();
                        if (list.Count > 0)
                        {
                            typeCardList.AddRange(list);
                            depth--;
                        }
                    }
                    level--;
                }                
            };

            #region 五炸
            func(10, () => GetFiveBomb(,,,, kingCount));
            #endregion
            #region 順子(包含同花順)
            func(9, () => GetStraightFlush(,,,, ));
            #endregion
            #region 炸彈
            func(8, () => GetBomb( ,,,, l3));
            #endregion
            #region 葫蘆
            func(7, () => GetGourd(,,,,, OneNum));

            #endregion
            #region 同花
            func(6, () => GetFlush(,,,,));

            #endregion
            func(5, () => GetStraight(,,,, ,));
            #region 三張
            func(4, () => GetThree(,,,,));
            #endregion
            #region 兩對
            func(3, () => GetTwoPair( ,,,,));
            #endregion
            #region 對子
            func(2, () => GetPair( ,,,,));

            #endregion
            func(1, () => GetSingle(,,,,));
            return typeCardList;
        }

 

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