C#计算24点

C# 专栏收录该内容
2 篇文章 0 订阅

#region   24点算法
        /*
         * Count24(3,3,7,7)
         * 穷举法
         *
         */

        private string[] countMethod = new string[] { "+", "-", "*", "/" };
        private int[] countNum;
        private int[] countNumBak;

        public string Count24(int a, int b, int c, int d)
        {
            countNumBak = new int[4] { a, b, c, d };
            countNum = new int[4];
            string result = "没有找到合适的方法";
            bool isTrue;

            //把   abcd   四个数字随机付给数组   countNum
            for (int i = 0; i < 4; i++)
            {
                countNum[0] = countNumBak[i];
                for (int j = 0; j < 4; j++)
                {
                    if (j == i)
                        continue;
                    countNum[1] = countNumBak[j];
                    for (int k = 0; k < 4; k++)
                    {
                        if (k == j || k == i)
                            continue;
                        countNum[2] = countNumBak[k];
                        countNum[3] = countNumBak[1 + 2 + 3 - i - j - k];

                        result = countMain24(countNum, out isTrue);
                        if (!isTrue)
                        {
                            result = countMain(countNum, out isTrue);
                        }

                        if (isTrue)
                            return result;
                        else
                            result = "没有找到合适的方法";
                    }
                }
            }

            return result;
        }

        /// <summary>
        /// 组合计算,(第一个数字(方法)第二个数字)  (方法)  (第三个数字)(方法)(第四个数字)
        /// </summary>
        /// <param name="countNum"></param>
        /// <param name="isTrue"></param>
        /// <returns></returns>
        private string countMain(int[] countNum, out bool isTrue)
        {
            float a, b, c;
            string result = string.Empty;
            isTrue = false;
           
            foreach (string method in countMethod)
            {
                a = eval(method, (float)countNum[0], (float)countNum[1]);
                foreach (string m in countMethod)
                {
                    b = eval(method, (float)countNum[2], (float)countNum[3]);

                    foreach (string n in countMethod)
                    {
                        c = eval(n, a, b);

                        if (Math.Round(c, 4) == 24)
                        {
                            result = "(" + countNum[0].ToString() + method + countNum[1].ToString() + ")";
                            result += n + "("+countNum[2].ToString() + m + countNum[3].ToString() +")";
                            isTrue = true;
                            goto TODO;
                        }
                    }

                }
            }
            TODO:
            return result;
        }

        /// <summary>
        /// 顺序计算,第一个数字(方法)第二个数字(方法)第三个数字(方法)第四个数字
        /// </summary>
        /// <param name="countNum"></param>
        /// <param name="isTrue"></param>
        /// <returns></returns>
        private string countMain24(int[] countNum, out bool isTrue)
        {
            string result = "";
            float countValue = 0;
            float countValueBak = 0;
            isTrue = false;
            float upValueA, upValueBakA;
            float upValueB, upValueBakB;

            //   a   (方法)   b   (方法)   c   (方法)   d
            for (int i = 0; i < 4; i++)
            {   //不必计算   b/a   的情况,数组重排列中会计算到此种情况
                if (countMethod[i] == "/" && countNum[1] == 0)
                    countValue = (float)countNum[0];
                else
                    countValue = eval(countMethod[i], (float)countNum[0], (float)countNum[1]);

                upValueA = countValue;
                upValueBakA = countValue;

                for (int j = 0; j < 4; j++)
                {
                    //第一种情况   (a和b的结果)   (方法)   c    
                    if (countMethod[j] == "/" && countNum[2] == 0)
                    { }
                    else
                    {
                        countValue = eval(countMethod[j], upValueA, (float)countNum[2]);
                    }

                    //第二种情况   c   (方法)   (a和b的结果)
                    if (countMethod[j] == "/" && upValueBakA == 0)
                    {
                        countValueBak = upValueBakA;
                    }
                    else
                    {
                        countValueBak = eval(countMethod[j], (float)countNum[2], upValueBakA);
                    }

                    upValueB = countValue;
                    upValueBakB = countValueBak;

                    for (int k = 0; k < 4; k++)
                    {
                        //第一种情况   d   (方法)   (a,b,c的结果1)
                        if (countMethod[k] == "/" && upValueB == 0)
                        { }
                        else
                        {
                            countValue = eval(countMethod[k], (float)countNum[3], upValueB);
                            if (Math.Round(countValue, 4) == 24)
                            {//如果已经得到24点,则结束本程序
                                result = countNum[3].ToString() + countMethod[k] + "((" + countNum[0].ToString() + countMethod[i] + countNum[1].ToString() + ")";
                                result += countMethod[j] + countNum[2].ToString() + ")";
                                result += "   =   24";
                                isTrue = true;
                                return result;
                            }
                        }

                        //第二种情况   (a,b,c的结果1)   (方法)   d
                        if (countMethod[k] == "/" && countNum[3] == 0)
                        { }
                        else
                        {
                            countValue = eval(countMethod[k], upValueB, (float)countNum[3]);
                            if (Math.Round(countValue, 4) == 24)
                            {//如果已经得到24点,则结束本程序
                                result = "((" + countNum[0].ToString() + countMethod[i] + countNum[1].ToString() + ")";
                                result += countMethod[j] + countNum[2].ToString() + ")";
                                result += countMethod[k] + countNum[3].ToString() + "   =   24";
                                isTrue = true;
                                return result;
                            }
                        }

                        //第三种情况   d   (方法)   (a,b,c的结果2)
                        if (countMethod[k] == "/" && upValueBakB == 0)
                        { }
                        else
                        {
                            countValueBak = eval(countMethod[k], (float)countNum[3], upValueBakB);
                            if (Math.Round(countValueBak, 4) == 24)
                            {//如果已经得到24点,则结束本程序
                                result = countNum[3].ToString() + countMethod[k] + "(" + countNum[2].ToString() + countMethod[j] + "(" + countNum[0].ToString() + countMethod[i] + countNum[1].ToString() + "))";
                                result += "   =   24";
                                isTrue = true;
                                return result;
                            }
                        }

                        //第四种情况   (a,b,c的结果2)   (方法)   d
                        if (countMethod[k] == "/" && countNum[3] == 0)
                        { }
                        else
                        {
                            countValueBak = eval(countMethod[k], upValueBakB, (float)countNum[3]);
                            if (Math.Round(countValueBak, 4) == 24)
                            {//如果已经得到24点,则结束本程序
                                result = "(" + countNum[2].ToString() + countMethod[j] + "(" + countNum[0].ToString() + countMethod[i] + countNum[1].ToString() + "))";
                                result += countMethod[k] + countNum[3].ToString();
                                result += "   =   24";
                                isTrue = true;
                                return result;
                            }
                        }
                    }
                }
            }

            return "";
        }

        private float eval(string method, float a, float b)
        {
            switch (method)
            {
                case "+":
                    return a + b;
                case "-":
                    return a - b;
                case "*":
                    return a * b;
                case "/":
                    if (b == 0)
                    {
                        return a;
                    }
                    else
                    {
                        return a / b;
                    }
                default:
                    return 0;
            }
        }
        #endregion

 
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

hj3793

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值