现在我有计算+,-,*,/,()算式的算法
即给一个加减乘除包含括号的字符串式子,该算法能算出该算式的值int getResult(String expresion);
现在打算写一个24点游戏的,
随便取出4张扑克牌,例如2,4,J,7
相应抽出24点的式子是(2+4)*(11-7)
JQKA分别是11,12,13,1
其中有个功能是电脑算出能拼出24点的算式,并表示出来,如果没有,就显示没有解
我是打算现将得出的4个数,全排列,同时在数字之间的间隙加上+ - * /运算符号
这样大概就有4!*4^3中可能性,还要添上括号
这就更麻烦了现在小弟向大家求助一下,提供一下思路,小弟感激不尽
即给一个加减乘除包含括号的字符串式子,该算法能算出该算式的值int getResult(String expresion);
现在打算写一个24点游戏的,
随便取出4张扑克牌,例如2,4,J,7
相应抽出24点的式子是(2+4)*(11-7)
JQKA分别是11,12,13,1
其中有个功能是电脑算出能拼出24点的算式,并表示出来,如果没有,就显示没有解
我是打算现将得出的4个数,全排列,同时在数字之间的间隙加上+ - * /运算符号
这样大概就有4!*4^3中可能性,还要添上括号
这就更麻烦了现在小弟向大家求助一下,提供一下思路,小弟感激不尽
因为排列组合的关系,有重复的计算式子,如果不允许重复,LZ自己过滤掉重复的结果
import java.util.*;
import javax.script.*;
public class Test {
public static void main(String[] args) throws Throwable {
int[] num = {2, 4, 11, 7};
//int[] num = {11, 12, 13, 1};
List<String> list = exp(num);
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("JavaScript");
for (String s : list) {
Object v = se.eval(s);
double d = 0;
if (v instanceof Integer) {
d = ((Integer)v).intValue();
} else if (v instanceof Double) {
d = ((Double)v).doubleValue();
} if (d - 24 == 0) {
System.out.printf("%s=%d\n", s, (int)d);
}
}
} public static List<String> exp(int[] num) {
List<String> list = new ArrayList<String>();
if (num==null || num.length < 2) return list; if (num.length == 2) {
list.add(String.format("%s+%s", num[0], num[1]));
list.add(String.format("%s-%s", num[0], num[1]));
list.add(String.format("%s-%s", num[1], num[0]));
list.add(String.format("%s*%s", num[0], num[1]));
list.add(String.format("%s.0/%s", num[0], num[1]));
list.add(String.format("%s.0/%s", num[1], num[0]));
} int[] tmp = new int[num.length-1];
for (int i=0; i<num.length; i++) {
for (int j=0, k=0; j<num.length; j++) {
if (j != i) tmp[k++] = num[j];
} List<String> sub = exp(tmp); for (String s : sub) {
list.add(String.format("%s+%s", num[i], s));
list.add(String.format("%s-%s", num[i], s));
list.add(String.format("%s-%s", s, num[i]));
list.add(String.format("%s*%s", num[i], s));
list.add(String.format("%s*%s", s, num[i]));
list.add(String.format("%s.0/%s", num[i], s));
list.add(String.format("%s/%s.0", s, num[i]));
String[] sa = s.split("\\d+([.]\\d+)?");
if (! s.startsWith("(")) {
if (sa[1].equals("+") || sa[1].equals("-")) {
list.add(String.format("%s*(%s)", num[i], s));
list.add(String.format("%s.0/(%s)", num[i], s));
list.add(String.format("(%s)/%s.0", s, num[i]));
} else {
list.add(String.format("%s.0/(%s)", num[i], s));
int index = s.indexOf(sa[1]);
String b = s.substring(0, index);
String c = s.substring(index);
list.add(String.format("(%s+%s)%s", num[i], b, c));
list.add(String.format("(%s-%s)%s", num[i], b, c));
list.add(String.format("(%s-%s)%s", b, num[i], c));
list.add(String.format("(%s*%s)%s", num[i], b, c));
list.add(String.format("(%s.0/%s)%s", num[i], b, c));
list.add(String.format("(%s/%s.0)%s", b, num[i], c));
}
}
}
} return list;
}
}