简单写了个24点的代码

remagon 2011-03-09 12:52:17
上午闲着没事,随便写了写,算是抛砖引玉吧


internal sealed class TwentyFour
{
private int total;
private int[] data;

public TwentyFour(int total, int[] data)
{
this.total = total;
this.data = data;
}

public string Run()
{
if (data == null)
return "no data";
List<DataResult> iniData = new List<DataResult>();
for (int i = 0; i < data.Length; i++)
{
iniData.Add(new DataResult(data[i]));
}
DataResult result = GetResult(iniData);

if (result == null)
{
return "no arithmetic";
}
else
{
return result.ToString();
}
}

private DataResult GetResult(List<DataResult> arr)
{
DataResult result;
if (arr.Count == 2)
{
result = new DataResult(arr[0], arr[1], NumOpera.Add);
if (Math.Abs(result.result - total) < 0.00001)
return result;

result = new DataResult(arr[0], arr[1], NumOpera.Sub);
if (Math.Abs(result.result - total) < 0.00001)
return result;

result = new DataResult(arr[1], arr[0], NumOpera.Sub);
if (Math.Abs(result.result - total) < 0.00001)
return result;

result = new DataResult(arr[0], arr[1], NumOpera.Mul);
if (Math.Abs(result.result - total) < 0.00001)
return result;

if (arr[1].result != 0)
{
result = new DataResult(arr[0], arr[1], NumOpera.Div);
if (Math.Abs(result.result - total) < 0.00001)
return result;
}

if (arr[0].result != 0)
{
result = new DataResult(arr[1], arr[0], NumOpera.Div);
if (Math.Abs(result.result - total) < 0.00001)
return result;
}
return null;
}
List<DataResult> tempList = new List<DataResult>();
for (int i = 0; i < arr.Count; i++)
{
for (int j = i + 1; j < arr.Count; j++)
{
DataResult temp;
tempList.Clear();
for (int m = 0; m < arr.Count; m++)
{
if (m == i || m == j)
continue;
else
tempList.Add(arr[m]);
}

temp = new DataResult(arr[i], arr[j], NumOpera.Add);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);

temp = new DataResult(arr[i], arr[j], NumOpera.Sub);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);

temp = new DataResult(arr[j], arr[i], NumOpera.Sub);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);

temp = new DataResult(arr[i], arr[j], NumOpera.Mul);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);

if (arr[j].result != 0)
{
temp = new DataResult(arr[i], arr[j], NumOpera.Div);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);
}

if (arr[i].result != 0)
{
temp = new DataResult(arr[j], arr[i], NumOpera.Div);
tempList.Add(temp);
result = GetResult(tempList);
if (result != null)
return result;
tempList.Remove(temp);
}
}
}
return null;
}
}

enum NumOpera
{
Add,
Sub,
Mul,
Div
}

internal sealed class DataResult
{
public double result;

private NumOpera opt;

private DataResult data1;

private DataResult data2;

public DataResult(double da)
{
result = da;
}

public DataResult(DataResult d1, DataResult d2, NumOpera op)
{
opt = op;
data1 = d1;
data2 = d2;

switch (opt)
{
case NumOpera.Add:
result = d1.result + d2.result;
break;
case NumOpera.Div:
result = d1.result / d2.result;
break;
case NumOpera.Mul:
result = d1.result * d2.result;
break;
case NumOpera.Sub:
result = d1.result - d2.result;
break;
}
}

public override string ToString()
{
if (data1 != null && data2 != null)
{
switch (opt)
{
case NumOpera.Add:
return "(" + data1.ToString() + "+" + data2.ToString() + ")";
case NumOpera.Div:
return "(" + data1.ToString() + "/" + data2.ToString() + ")";
case NumOpera.Mul:
return "(" + data1.ToString() + "*" + data2.ToString() + ")";
case NumOpera.Sub:
return "(" + data1.ToString() + "-" + data2.ToString() + ")";
}
}
return result.ToString();
}
}
...全文
182 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2011-03-09
  • 打赏
  • 举报
回复
感谢楼主分享~!
大忠 2011-03-09
  • 打赏
  • 举报
回复
呵呵,24点算法还满考验初学者的。
云瑀 2011-03-09
  • 打赏
  • 举报
回复
真棒!!!
remagon 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sudianbo 的回复:]
是4张牌快速算24吗(加减乘除)
[/Quote]
对,也可以算其他的
小阳 2011-03-09
  • 打赏
  • 举报
回复
楼主的代码运行结果是神马啊!
_三皮_ 2011-03-09
  • 打赏
  • 举报
回复
是4张牌快速算24吗(加减乘除)
founderfang 2011-03-09
  • 打赏
  • 举报
回复
楼主不用上班吗?居然可以上午没事写段代码玩,羡慕啊。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧