24Point

import java.util.HashSet;

public class Game24Point {
private static int n = 4;
private static int size = (int) Math.pow(2, n);
private static HashSet<Double>[] S = new HashSet[size];
private static double[] array = { 5, 5, 5, 1 };
private static double targetNum = 576;

private static boolean useFactorial = true;

private static void init() {
for (int i = 0; i < size; i++) {
S[i] = null;
}
for (int i = 0; i < n; i++) {
int temp = (int) Math.pow(2, i);
S[temp] = new HashSet<Double>();
S[temp].add(array[i]);
if (useFactorial) {
S[temp].add(new Double(factorial((int) array[i])));
}
}
for (int i = 0; i < size; i++) {
S[i] = f(i);
}
Check(S[(int) Math.pow(2, n) - 1]);
}

private static void Check(HashSet<Double> arrayList) {
for (Double temp : arrayList) {
if (Math.abs(temp - targetNum) < 1E-6) {
System.out.println("Succeed");
}
}

}

private static HashSet<Double> f(int i) {
if (S[i] != null) {
return S[i];
}
S[i] = new HashSet<Double>();
for (int x = 1; x < i; x++) {
if ((x & i) == x) {
for (Double temp : Fork(f(x), f(i - x))) {
S[i].add(temp);
// if (useFactorial) {
// if (Math.abs(temp - (int) temp.doubleValue()) < 1E-6
// && temp > 0) {
// S[i].add(new Double(factorial((int) temp
// .doubleValue())));
// }
// }
}
}
}
return S[i];
}

private static HashSet<Double> Fork(HashSet<Double> hashSet,
HashSet<Double> hashSet2) {
HashSet<Double> ret = new HashSet<Double>();
for (Double a : hashSet) {
for (Double b : hashSet2) {
ret.add(a + b);
ret.add(a - b);
ret.add(b - a);
ret.add(a * b);
if (b != 0) {
ret.add(a / b);
}
if (a != 0) {
ret.add(b / a);
}
}
}
return ret;
}

private static int factorial(int x) {
if (x < 0) {
throw new IllegalArgumentException("x must be>=0");
}
int fact = 1;
for (int i = 2; i <= x; i++) {
fact *= i;
}
return fact;
}

/**
* @param args
*/
public static void main(String[] args) {
init();

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值