24点算法
题目:给四个数,用+,-,*,/进行组合,使得结果的等于24,如:1,5,5,5,则(5-1/5)*5=24
下面是我自己的算法,没有对算术表达式进行过滤~比如会认为((9-8)+7)*3 = 24和((9+7)-8)*3 = 24是不同的表达式组合
Java SE6编译通过,如有缺点请指正~
1
import java.util.*;2

3

/** *//**4
* 24点算法5
*/6
class Create247


{8
public static void main(String[] args) 9

{10
// 存放4个整数11
List<Float> dold = new ArrayList<Float>();12
13
// 初始化,添加四个整数14
dold.add(9f);15
dold.add(8f);16
dold.add(7f);17
dold.add(3f);18
19
// 根据四个整数得出所有的排序情况20
List<List<Float>> dd = creatNum(dold);21
22
// 打印出可能的序列23
System.out.println("共有" + dd.size() + "排序方式!");24
for (List<Float> x : dd) 25

{26
for (float xx : x)27

{28
System.out.print((int)xx + " ");29
}30
System.out.println("");31
}32
33
// 记录所有的计算结果34
List<List<Float>> tmp2 = new ArrayList<List<Float>>();35
36
// 记录所有的表达式37
List<String> strList2 = new ArrayList<String>();38
39
// 得到所有可能的结果和表达式40
calcReuslt(dd, tmp2, strList2);41
42
// 打印出所有可能等于24的算术表达式43
int hh = 0;44

for(List<Float> l1 : tmp2)
{45

for(float j1 : l1)
{46
if (j1 == 24)47

{48
System.out.println((strList2.get(hh)) + " = " + (int)j1);49
} else if (j1 == -24)50

{ 51
// 得数为负值时需要在表达式前加负号52
System.out.println("-" + (strList2.get(hh)) + " = " + (int)(-j1));53
}54
hh++;55
}56
}57
58
}59
60

/** *//**61
* 得到所有可能的结果和表达式62
*/63

private static void calcReuslt (List<List<Float>> dd, List<List<Float>> tmp2, List<String> strList2)
{64

65
for (List<Float> d : dd)66

{67
// 得到第一个和第二数字的计算结果68
List<Float> tmp0 = calcTwoNum(d.get(0), d.get(1));69

70
// 存放第一个和第二数字的表达式71
List<String> strList0 = new ArrayList<String>();72
// 得到第一个和第二数字的表达式73
creatStr(strList0, String.valueOf(d.get(0).intValue()), String.valueOf(d.get(1).intValue()), 1);74

75
// 存放第一、第二数字的计算结果和第三个数字的计算结果76
List<List<Float>> tmp1 = new ArrayList<List<Float>>();77
// 存放第一、第二数字的计算结果和第三个数字的表达式78
List<String> strList1 = new ArrayList<String>();79

80
int ii = 0;81

for(float i : tmp0)
{82

83
// 得到第一、第二数字的计算结果和第三个数字的计算结果84
tmp1.add(calcTwoNum(i, d.get(2)));85

86
// 得到第一、第二数字的计算结果和第三个数字的表达式87
creatStr(strList1, strList0.get(ii), String.valueOf(d.get(2).intValue()), 1);88

89
ii++;90
}91

92
int gg = 0;93

for(List<Float> l : tmp1)
{94

for(float j : l)
{95
// 得到前三个数字和第四个数字的计算结果96
tmp2.add(calcTwoNum(j, d.get(3)));97

98
// 得到前三个数字和第四个数字的表达式99
creatStr(strList2, strList1.get(gg), String.valueOf(d.get(3).intValue()), 0);100

101
gg++;102
}103
}104

105
}106
}107
108

/** *//**109
* 组合表达式110
*/111

private static void creatStr(List<String> l, String a, String b, int hasBracket)
{112

String[] operatorArr =
{"+", "-", "*", "/"};113
114
for (String opr : operatorArr)115

{116
// 需要括号117
if (hasBracket == 1)118

{119
l.add("(" + a + opr + b + ")");120

} else
{121
l.add(a + opr + b);122
}123
}124
}125

126

/** *//**127
* 得出所有的排序情况128
*/129

private static List<List<Float>> creatNum(List<Float> d)
{130
List<List<Float>> a = new ArrayList<List<Float>>();131
132
if (d.size() == 1)133

{134
List<Float> dd1 = new ArrayList<Float>();135
dd1.add(d.get(0));136
a.add(dd1);137
return a;138

139

} else
{140
for (int j=0;j<d.size();j++)141

{142
List<Float> d3 = new ArrayList<Float>();143
144
// 将传入的List复制出来145
for (int i=0;i<d.size();i++)146

{147
d3.add(d.get(i));148
}149

150
float x = d3.get(j);151
d3.remove(j);152
153
// 递归154
List<List<Float>> tmp1 = creatNum(d3);155
156
for (List<Float> l : tmp1)157

{ 158
List<Float> d2 = new ArrayList<Float>();159
// 添加第一位截取的数字160
d2.add(x);161
// 添加递归后得到的数字162
for (float f : l)163

{164
d2.add(f);165
}166
a.add(d2);167
}168
}169
return a;170
}171
}172

173

/** *//**174
* 得到两个数加减乘除后的结果 175
*/176

private static List<Float> calcTwoNum(float n1, float n2)
{177
List<Float> a = new ArrayList<Float>();178
a.add(n1 + n2);179
a.add(n1 - n2);180
a.add(n1 * n2);181
a.add(n1 / n2);182
return a;183
}184
}posted on 2009-03-06 15:04 lostheaven 阅读(1369) 评论(2) 收藏 举报
浙公网安备 33010602011771号