24点游戏的算法,貌似用二叉树。懂的人进来说说。谢谢!四个数,三个符号。运算出来的结果为24.
解决方案 »
- C# treeview richtextbox 遍历
- TreeView的加载,麻烦看看,急
- C#邮件发送问题!
- 第二个窗口录入数据怎样在原窗口的DataGrid立即进行更新能否写出源码,谢谢用C#
- C# 如何捕网页获弹出的对话框!!!!!!!!!!
- 批量删除问题
- 有没有应用delegate的BeginInvoke和EndInvoke的小例子?
- 怎样在win应用程序中打开变量为aaa的本程序的窗口
- 在DataView里如何获得某一列的值?
- C#的非安全代码和一个看似小问题,但又不小的问题
- C# Bitmap.Clone 方法,提示内存不足
- IHTMLDocument2 使用 write 方法后, 内存不释放
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
谢谢 不知道有没有二叉树的算法 我印象里好像有
using System.Collections.Generic;
using System.Text;class TwentyFourProblem
{
static void Main()
{
string datas = "";
string operators = @"+_-_*_/_|_\";
string temData = "";
for (int i = 0; i < 4; i++)
datas += Console.ReadLine() + "_";
List<string> dataPermutations = new List<string>();
List<string> operatorsCombinations = new List<string>();
List<string> solutions = new List<string>();
AllPermutation(datas, temData, dataPermutations);
AllCombination(1, 3, operators, "", operatorsCombinations);
foreach (string temDatas in dataPermutations)
foreach (string temOperators in operatorsCombinations)
{
calculate(temDatas, temOperators, "", "", solutions);
}
foreach (string solution in solutions)
Console.Write(solution + "\n");
Console.Write("over");
}
private static void AllPermutation(string datas, string temData, List<string> permutations)
{
string[] data = datas.Split('_');
for (int i = 0; i < data.Length - 1; i++)
{
if (data.Length == 2)
{
string temPermutation = temData + data[i];
permutations.Add(temPermutation);
}
else
{
string tem = temData;
temData += data[i] + '_';
datas = "";
for (int j = 0; j < data.Length - 1; j++)
if (j != i)
datas += data[j] + '_';
AllPermutation(datas, temData, permutations);
temData = tem;
}
}
} private static void AllCombination(int rankCount, int rank, string datas, string temCombination, List<string> combinations)
{
string[] data = datas.Split('_');
for (int i = 0; i < data.Length; i++)
{
if (rankCount == rank)
combinations.Add(temCombination + data[i]);
else
{
string temStr = temCombination;
temCombination += data[i] + "_";
AllCombination(++rankCount, rank, datas, temCombination, combinations);
rankCount--;
temCombination = temStr;
}
}
} private static void calculate(string datas, string operators, string lastOperator, string temSolution, List<string> solutions)
{
string[] data = datas.Split('_');
string[] temOperator = operators.Split('_');
if (data.Length > 1)
{
string result = operatorOperation(data[0], data[1], temOperator[0]).ToString();
if ((temOperator[0] == "\\" && lastOperator != "") || (temOperator[0] == "|" && (lastOperator == "-" || lastOperator == "+" || lastOperator == "|")) || ((temOperator[0] == "*" || temOperator[0] == "/") && (lastOperator == "+" || lastOperator == "-" || lastOperator == "|")))
{
temSolution = temSolution.Insert(0, "(");
temSolution += ")";
}
if (data.Length == 4)
temSolution += data[0];
if (temOperator[0] == "|" || temOperator[0] == "\\")
{
string temOp = "";
if (temOperator[0] == "|")
temOp = "-";
else temOp = "/";
temSolution = temSolution.Insert(0, data[1] + temOp);
}
else temSolution += temOperator[0] + data[1];
string newDatas = "";
string newOperators = "";
for (int j = 2; j < data.Length; j++)
newDatas += data[j] + "_";
newDatas = newDatas.Insert(0, result + "_");
for (int j = 1; j < temOperator.Length; j++)
newOperators += temOperator[j] + "_";
if (newOperators == "")
newOperators = "?";
calculate(newDatas.Substring(0, newDatas.Length - 1), newOperators.Substring(0, newOperators.Length - 1), temOperator[0], temSolution, solutions);
}
else if (data.Length == 1)
{
if (Math.Abs(double.Parse(data[0]) - 24) <= 0.000001)
solutions.Add(temSolution);
}
} private static double operatorOperation(string data1, string data2, string Operator)
{
double result = 0;
double num1 = double.Parse(data1);
double num2 = double.Parse(data2);
switch (Operator)
{
case "+": result = num1 + num2; break;
case "-": result = num1 - num2; break;
case "*": result = num1 * num2; break;
case "/": result = num1 / num2; break;
case "|": result = num2 - num1; break;
case "\\": result = num2 / num1; break;
}
return result;
}
}