日期:2014-05-18  浏览次数:20873 次

24点游戏的算法,貌似用二叉树。懂的人进来说说。谢谢!
24点游戏的算法,貌似用二叉树。懂的人进来说说。谢谢!

四个数,三个符号。运算出来的结果为24.

------解决方案--------------------
C# code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Text.RegularExpressions;

namespace MyCsStudy
{
    /// <summary>
    /// 24点算法
    /// </summary>
    class TwentyFour
    {
        public static List<string> listOps = new List<string>(); //存加减乘除运算符
        static TwentyFour()
        {
            listOps.Add("+");
            listOps.Add("-");
            listOps.Add("*");
            listOps.Add("/");
        }
        public static bool Computing(string[] numArr, int numLen, int targetNum)
        {
            bool flag = false;
            for (int i = 0; i < numLen; i++)
            {
                for (int j = i + 1; j < numLen; j++)
                {
                    string[] strij = new string[] { numArr[i], numArr[j] };
                    numArr[j] = numArr[numLen - 1];
                    for (int k = 0; k < listOps.Count; k++)
                    {
                        numArr[i] = "(" + strij[0] + listOps[k] + strij[1] + ")";
                        if (Computing(numArr, numLen - 1, targetNum))
                        {
                            flag = true;
                            return flag;
                        }
                    }
                    numArr[i] = strij[0];
                    numArr[j] = strij[1];
                }
            }
            System.Data.DataTable dt = new System.Data.DataTable();
            string expression = numArr[0];
            /*
             * 利用datatable的compute方法计算字符串表达式(不知c有没有类似方法)
             * 如果不用datatable的compute方法,不知还有没有其他c#函数?
             * 期待高手给出更直观的解答
             */
            object objNum = dt.Compute(expression, "");
            int result;
            int.TryParse(objNum.ToString(), out result);

            //如果运算结果是预期的数字,而且数组中的数字全部在运算范畴内
            if (result == targetNum && numLen == 1)
                flag = true;
            return flag;
        }

------解决方案--------------------
我也可以参考这个:
http://blog.csdn.net/hj3793/article/details/1844148
------解决方案--------------------
这个真没有,所谓的二叉树的算法。其实是中缀表达式。实际上个人建议后缀表达式,也就是一般说的逆波兰表达式