/*** Witontek.com.
* Copyright (c) 2012-2016 All Rights Reserved.*/
packagecom.sutong.wechat.demo;importjava.util.ArrayList;importjava.util.List;importnet.sourceforge.jeval.EvaluationException;importnet.sourceforge.jeval.Evaluator;/***
*@authorxiaolong.ma
*@version$Id: Card24.java, v 0.1 2016年8月19日 下午3:33:37 xiaolong.ma Exp $*/
public classCard24 {/***
*@paramargs
*@throwsEvaluationException*/
public static void main(String[] args) throwsEvaluationException {
Card24 c= newCard24();
c.cards= "4,5,6,7";
System.out.println(c.calc());
}/*** Getter method for property cards.
*
*@returnproperty value of cards*/
publicString getCards() {returncards;
}/*** Setter method for property cards.
*
*@paramcards value to be assigned to property cards*/
public voidsetCards(String cards) {this.cards =cards;
}privateString cards;private List tempList = new ArrayList();private List opList = new ArrayList();private List cardList = new ArrayList();public String calc() throwsEvaluationException {//a1,a2,a3,a4//
//先排列全//然后,o1,o2,o3 进行排列//最后,括号//(a1,a2)(a3,a4)//a1,a2,a3,a4//(a1,a2)a3,a4//(a1,a2,a3)a4
String[] arrs= cards.split("\\D");if (arrs.length != 4) {return "必须为4位";
}//1.全排列
permCard(arrs, 0, 3);
String[] ops= { "+", "-", "*", "/"};
permOp(ops,0, 3);
Evaluator eval= newEvaluator();for (int i = 0; i < cardList.size(); i++) {
String[] ta=cardList.get(i);for (int j = 0; j < opList.size(); j++) {
String[] to=opList.get(j);
List list =create(ta, to);for(String s : list) {//Object result = fel.eval(s);
String s24=eval.evaluate(s);float l24 =Float.parseFloat(s24);if (l24 == 24) {returns;
}
}
}
}return "没有算出来。。";
}//全排列
public void permCard(String[] buf, int start, intend) {if (start == end) {//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
for (int i = 0; i <= end; i++) {//System.out.print(buf[i]);
tempList.add(buf[i]);
}//System.out.println();
String[] newBuf = new String[4];for (int i = 0; i < tempList.size(); i++) {
newBuf[i]=tempList.get(i);
}
cardList.add(newBuf);
tempList.clear();
}else {//多个字母全排列
for (int i = start; i <= end; i++) {
String temp= buf[start];//交换数组第一个元素与后续的元素
buf[start] =buf[i];
buf[i]=temp;
permCard(buf, start+ 1, end);//后续元素递归全排列
temp= buf[start];//将交换后的数组还原
buf[start] =buf[i];
buf[i]=temp;
}
}
}//取操作符
public void permOp(String[] buf, int start, intend) {
String[] opArr= { "+", "-", "*", "/"};for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {for (int k = 0; k < 4; k++) {
String[] newBuf= new String[3];
newBuf[0] =opArr[i];
newBuf[1] =opArr[j];
newBuf[2] =opArr[k];
opList.add(newBuf);
}
}
}
}//增加括号
private Listcreate(String[] ta, String[] to) {//a1,a2,a3,a4//(a1,a2)a3,a4//(a1,a2,a3)a4//(a1,a2)(a3,a4)
List list = new ArrayList();
list.add(ta[0] + to[0] + ta[1] + to[1] + ta[2] + to[2] + ta[3]);
list.add("(" + ta[0] + to[0] + ta[1] + ")" + to[1] + ta[2] + to[2] + ta[3]);
list.add("(" + ta[0] + to[0] + ta[1] + to[1] + ta[2] + ")" + to[2] + ta[3]);
list.add("(" + ta[0] + to[0] + ta[1] + ")" + to[1] + "(" + ta[2] + to[2] + ta[3] + ")");returnlist;
}
}