成都麻将换三张胡牌算法 (成都麻将换三张的换牌顺序)

成都桑拿 05-30 阅读:45 评论:0

写在前面

本算法适用于成都麻将换三张玩法,以下简称“换三张”。换三张是一种流行于四川成都地区的一种麻将变种,其规则与传统麻将有较大的不同。

算法流程

本算法采用深度优先搜索(DFS)算法,流程如下:1. 将输入的牌组按花色分类,并初始化待胡牌组。2. 遍历所有可能的换牌组合,并对每个换牌组合执行以下步骤:a. 根据换牌组合,替换待胡牌组中的对应牌张。b. 调用DFS函数,对新的待胡牌组进行胡牌检测。c. 如果检测到胡牌,则记录胡牌信息并返回。3. 遍历所有可能的换牌组合完毕后,如果没有检测到胡牌,则返回“无胡”。

胡牌检测

胡牌检测算法如下:1. 将待胡牌组按顺子、刻子、杠子分组。2. 检查待胡牌组是否符合以下胡牌条件之一:a. 平胡:4个顺子、1个刻子;b. 清一色:所有牌张为同一花色;c. 七对:7个对子;d. 杠上花:胡牌时有4个杠子;e. 海底捞月:摸到最后一张牌胡牌;f. 抢杠胡:抢杠后胡牌;g. 鲜食:258万和258筒同时组成顺子或刻子。3. 如果待胡牌组满足上述条件,则返回“胡牌”,否则返回“无胡”。 成都麻将换三张胡牌算法 (成都麻将换三张的换牌顺序)

算法实现

下面是算法的Python实现:```pythonimport copy牌张花色SUITS = ["wan", "tong", "suo", "zi"]胡牌类型HU_TYPES = ["pinghu", "qingyise", "qiDui", "gangShangHua", "haiDiLaoYue", "qiangGangHu", "xianShi"]def hu_detector(hand):"""胡牌检测算法Args:hand: 待胡牌组Returns:bool: 是否胡牌"""分组shun_zi = []ke_zi = []gang_zi = []for card in hand:suit, number = card.split("-")if number in ["2", "5", "8"]:if suit in ["wan", "tong"]:shun_zi.append([card, "-".join([suit, str(int(number) + 1)]), "-".join([suit, str(int(number) + 2)])])else:if hand.count(card) == 3:ke_zi.append([card, card, card])elif hand.count(card) == 4:gang_zi.append([card, card, card, card])胡牌条件if len(shun_zi) == 4 and len(ke_zi) == 1:return "pinghu"elif len(shun_zi) == 4 and len(ke_zi) == 0 and any(card.split("-")[0] == suit for card in hand):return "qingyise"elif len(shun_zi) == 0 and len(ke_zi) == 7:return "qiDui"elif len(gang_zi) == 4:return "gangShangHua"elif len(shun_zi) == 0 and len(ke_zi) == 0and len(gang_zi) == 0 and card == "-".join([suit, "5"]) for card in hand:return "haiDiLaoYue"elif len(shun_zi) == 0 and len(ke_zi) == 0 and len(gang_zi) == 1:return "qiangGangHu"elif any("-".join([suit, "3"]) in sub_group for sub_group in shun_zi + ke_zi):return "xianShi"else:return "noHu"def dfs(hand, hu_combinations):"""深度优先搜索算法Args:hand: 待胡牌组hu_combinations: 换牌组合Returns:bool: 是否胡牌"""if hu_detector(hand) != "noHu":return Truefor hu_combination in hu_combinations:new_hand = copy.deepcopy(hand)for card_to_replace, card_to_add in hu_combination:new_hand.remove(card_to_replace)new_hand.append(card_to_add)if dfs(new_hand, hu_combinations):return Truereturn Falsedef main(hand):"""主函数Args:hand: 输入牌组Returns:bool: 是否胡牌"""初始化待胡牌组和换牌组合sorted_hand = sorted(hand)hu_hand = []hu_combinations = []for suit in SUITS:for number in range(1, 10):card = "-".join([suit, str(number)])if card in sorted_hand:hu_hand.append(card)else:for card_to_replace in sorted_hand:hu_combinations.append([(card_to_replace, card)])调用深度优先搜索算法return dfs(hu_hand, hu_combinations)if __name__ == "__main__":输入牌组示例hand = ["wan-1", "wan-2", "wan-3", "tong-4", "tong-5", "tong-6", "suo-7", "suo-8", "suo-9", "zi-dong", "zi-nan", "zi-xi", "zi-bei"]检测是否胡牌if main(hand):print("胡牌")else:print("无胡")```

复杂度分析

本算法的时间复杂度为O(2^n),其中n为输入牌组的长度。这是因为算法需要遍历所有可能的换牌组合,而换牌组合的数量为2^n。

使用说明

要使用本算法,需要将输入牌组以列表的形式输入到main函数中。如果检测到胡牌,算法将输出“胡牌”,否则输出“无胡”。

局限性

本算法只适用于成都麻将换三张玩法,不能用于其他麻将变种。算法没有考虑碰、杠、吃等规则,因此只适用于未听牌阶段。

结语

本文介绍了成都麻将换三张胡牌算法的原理、流程和实现。希望本算法能够帮助麻友们更好地理解和玩转成都麻将换三张。
版权声明

本文仅代表作者观点,不代表成都桑拿立场。
本文系作者授权发表,未经许可,不得转载。