IsHu_50_0_Normal

本文深入探讨了一种麻将胡牌算法的实现细节,通过递归和回溯的方式,检查手中的牌是否符合胡牌条件,包括顺子、刻子和对子的识别。文章详细解释了如何遍历牌组,寻找可能的胡牌组合,并通过实例展示了算法的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#region IsHu_50_0_Normal
        private void IsHu_50_0_Normal(List<int> _pailist)
        {
            if (isHu) { return; }//一旦胡就退出
            string Yupai = "";//输出用
            List<int> Tlist = new List<int>(_pailist.ToArray());//复制副本
            List<int> Vlist = new List<int>(_pailist.ToArray());//复制副本

            for (int i = Vlist.Count - 1; i > 0; i--)//去重复,减少循环次数
            {
                if (Vlist[i].Equals(Vlist[i - 1])) { Vlist.RemoveAt(i); }
            }

            List<string> found_Zhuhe = new List<string>();//找刻或顺的组合
            int maxshun = 0;
            for (int i = 0; i < Vlist.Count; i++)
            {
                int TT = (int)Vlist[i];
                if (Tlist.Contains(TT + 1) && Tlist.Contains(TT + 2) && TT < 60) //发现顺子;小于60指字牌和花牌不计顺
                {
                    if (maxshun == 0 || (TT - maxshun) < 3)//优化递归
                    {
                        found_Zhuhe.Add("S" + (TT).ToString());
                        maxshun = TT;
                    }
                }
                else if (Tlist.Count(x => x == TT) >= 3)//发现刻子
                {
                    found_Zhuhe.Add("K" + (TT).ToString());
                }
            }

            if (found_Zhuhe.Count == 0)//如果已经提取组合完毕,退出递归
            {
                Yupai = "|X" + string.Join("|X", Tlist.ToArray());//每一种组合后最终的余牌

                bool isIn_ZhuheAll = true;//剔除重复记录的组合
                string[] zhuheAllSplit = tmp_ZhuheAll.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                string[] zhuheSplit = tmp_Zhuhe.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);

                for (int i = 0; i < zhuheSplit.Length; i++)
                {
                    if (!zhuheAllSplit.Contains(zhuheSplit[i]))
                    {
                        tmp_ZhuheAll += "|" + zhuheSplit[i];//记录所有组合,用于识别剔除
                        isIn_ZhuheAll = false;
                    }
                }
                if (isIn_ZhuheAll == false || tmp_ZhuheAll.Count() == 0)//如果不重复
                {
                    tmp_YupaiZhuheAll = "";
                    if (Tlist.Count() == 2 && Tlist[0] == Tlist[1])//如果余牌是一对
                    {
                        isHu = true;
                       // Hu_Output.Add(tmp_Zhuhe + Yupai);//精减版,不输出胡牌方案到Hu_Output
                    }
                }
            }

            else//如果还有组合可以提取,找出各种组合,先提取,再递归,再恢复
            {
                for (int i = 0; i < found_Zhuhe.Count; i++)
                {
                    if (found_Zhuhe[i].Substring(0, 1) == "K")
                    {
                        string k = found_Zhuhe[i].Substring(1);
                        Tlist.Remove(int.Parse(k)); Tlist.Remove(int.Parse(k)); Tlist.Remove(int.Parse(k));
                        tmp_Zhuhe += "|K" + k;
                        IsHu_51_0_Normal(Tlist);
                        tmp_Zhuhe = tmp_Zhuhe.Remove(tmp_Zhuhe.LastIndexOf("|"));
                        Tlist.Add(int.Parse(k)); Tlist.Add(int.Parse(k)); Tlist.Add(int.Parse(k));
                        Tlist.Sort();
                    }
                    else if (found_Zhuhe[i].Substring(0, 1) == "S")
                    {
                        string s = found_Zhuhe[i].Substring(1);
                        Tlist.Remove(int.Parse(s)); Tlist.Remove(int.Parse(s) + 1); Tlist.Remove(int.Parse(s) + 2);
                        tmp_Zhuhe += "|S" + int.Parse(s).ToString();
                        IsHu_51_0_Normal(Tlist);
                        tmp_Zhuhe = tmp_Zhuhe.Remove(tmp_Zhuhe.LastIndexOf("|"));
                        Tlist.Add(int.Parse(s)); Tlist.Add(int.Parse(s) + 1); Tlist.Add(int.Parse(s) + 2);
                        Tlist.Sort();
                    }
                }
            }
        }
        #endregion//IsHu_50_0_Normal

转载于:https://my.oschina.net/u/3516766/blog/917792

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值