闲暇之余写了一个24点,请各位大虾指正!
缺点之一:有重复结果出现
临时解决:使用set防止重复
缺点之二:代码不够精简
缺点之三:算法仍需优化
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* 24点
*
* @author zhiguo.zhao
*
*/
public class Main {
static int N = 24;
static Set<String> rs = new HashSet<String>();
static int num = 0;
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
try {
while ((line = br.readLine()) != null) {
try {
if ("exit".equals(line))
break;
String[] s = line.split("\\s");
int[] v = new int[4];
for (int idx = 0; idx < 4; idx++) {
v[idx] = Integer.parseInt(s[idx]);
if (v[idx] <= 0 || v[idx] >= 10)
throw new Exception("Input error.");
}
rs.clear();
num = 0;
comb(new Comb(v[0]), new Comb(v[1]), new Comb(v[2]), new Comb(v[3]));
for (Iterator it = rs.iterator(); it.hasNext();) {
System.out.println(it.next());
}
System.out.println("total exec times:" + num);
} catch (Exception ex) {
ex.printStackTrace();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static void comb(Comb... v) {
for (int i = 0; i < v.length - 1; i++) {
for (int j = i + 1; j < v.length; j++) {
subcomb(i, j, new Comb(v[i], v[j], '+'), v);
subcomb(i, j, new Comb(v[i], v[j], '-'), v);
subcomb(i, j, new Comb(v[j], v[i], '-'), v);
subcomb(i, j, new Comb(v[i], v[j], '*'), v);
subcomb(i, j, new Comb(v[i], v[j], '/'), v);
subcomb(i, j, new Comb(v[j], v[i], '/'), v);
}
}
}
private static void subcomb(int i, int j, Comb c, Comb... v) {
int n = 0, p1 = 0, p2 = 0;
for (int k = 0; k < v.length; k++) {
if (k != i && k != j) {
n++;
if (n == 1) {
p1 = k;
} else if (n == 2) {
p2 = k;
}
}
}
if (n == 1) {
comb(c, v[p1]);
} else if (n == 2) {
comb(c, v[p1], v[p2]);
}
if (v.length == 2) {
try {
if (c.val() == N) {
rs.add(c.expression());
}
} catch (Exception e) {
}
}
num++;
}
}
class Comb {
private int n;// 分子
private int m;// 分母
private String el;// 表壳式
private char op;//操作符
Comb(int i) {
n = i;
m = 1;
}
Comb(int n, int m) {
this.n = n;
this.m = m;
}
Comb(Comb a, Comb b, char op) {
this.op = op;
switch (op) {
case '+':
n = a.add(b).n;
m = a.add(b).m;
el = "(" + a.expression() + op + b.expression() + ")";
;
break;
case '-':
n = a.min(b).n;
m = a.min(b).m;
el = "(" + a.expression() + op + b + ")";
;
break;
case '*':
n = a.mul(b).n;
m = a.mul(b).m;
el = "" + a + op + b;
break;
case '/':
n = a.div(b).n;
m = a.div(b).m;
el = "(" + a.expression() + op + b + ")";
;
break;
default:
break;
}
//el = "(" + a + op + b + ")";
}
Comb add(Comb b) {// 加
return new Comb(n * b.m + b.n * m, m * b.m);
}
Comb min(Comb b) {// 减
return new Comb(n * b.m - b.n * m, m * b.m);
}
Comb mul(Comb b) {// 乘
return new Comb(n * b.n, m * b.m);
}
Comb div(Comb b) {// 除
return new Comb(n * b.m, m * b.n);
}
int val() {// 值
if (n % m == 0)
return n / m;
else
throw new RuntimeException();
}
public String expression() {
if (el == null)
return "" + n;
if (el.startsWith("(") && el.endsWith(")")) {// 最终结果也不用加括号
return el.substring(1, el.length() - 1);
} else {
return toString();
}
}
@Override
public String toString() {
return el == null ? "" + n : el;
}
}