日期:2014-05-18 浏览次数:21041 次
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
------解决方案--------------------
这个真没有,所谓的二叉树的算法。其实是中缀表达式。实际上个人建议后缀表达式,也就是一般说的逆波兰表达式