
import java.util.Stack; |
/** |
* 计算24点 |
* |
* @author LiuFengQingYin |
*/ |
public class Game24 { |
private final static double _24 = 24; |
private final static double A = 1; |
private final static double J = 11; |
private final static double Q = 12; |
private final static double K = 13; |
private final static double[] seed = { A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K }; |
private final double[] pokerFaces = new double[4]; |
private final Stack<Object> partOne = new Stack<Object>(); |
private final Stack<Object> partTwo = new Stack<Object>(); |
private final Stack<Object> partThree = new Stack<Object>(); |
public boolean hasSolution() { |
pokerFaces[0] = seed[(int) Math.round(Math.random() * 12)]; |
pokerFaces[1] = seed[(int) Math.round(Math.random() * 12)]; |
pokerFaces[2] = seed[(int) Math.round(Math.random() * 12)]; |
pokerFaces[3] = seed[(int) Math.round(Math.random() * 12)]; |
|
System.out.println("4张牌为: " + pokerFaces[0] + ", " + pokerFaces[1] + ", " |
+ pokerFaces[2] + ", " + pokerFaces[3]); |
|
return (_24 == calculateAll(pokerFaces[0], pokerFaces[1], pokerFaces[2], pokerFaces[3])) |
|| (_24 == calculateAll(pokerFaces[0], pokerFaces[1], pokerFaces[3], pokerFaces[2])) |
|| (_24 == calculateAll(pokerFaces[0], pokerFaces[2], pokerFaces[3], pokerFaces[1])) |
|| (_24 == calculateAll(pokerFaces[0], pokerFaces[2], pokerFaces[1], pokerFaces[3])) |
|| (_24 == calculateAll(pokerFaces[0], pokerFaces[3], pokerFaces[2], pokerFaces[1])) |
|| (_24 == calculateAll(pokerFaces[0], pokerFaces[3], pokerFaces[1], pokerFaces[2])) |
|| (_24 == calculateAll(pokerFaces[1], pokerFaces[0], pokerFaces[2], pokerFaces[3])) |
|| (_24 == calculateAll(pokerFaces[1], pokerFaces[0], pokerFaces[3], pokerFaces[2])) |
|| (_24 == calculateAll(pokerFaces[1], pokerFaces[2], pokerFaces[0], pokerFaces[3])) |
|| (_24 == calculateAll(pokerFaces[1], pokerFaces[2], pokerFaces[3], pokerFaces[0])) |
|| (_24 == calculateAll(pokerFaces[1], pokerFaces[3], pokerFaces[0], pokerFaces[2])) |
|| (_24 == calculateAll(pokerFaces[1], pokerFaces[3], pokerFaces[2], pokerFaces[0])) |
|| (_24 == calculateAll(pokerFaces[2], pokerFaces[0], pokerFaces[1], pokerFaces[3])) |
|| (_24 == calculateAll(pokerFaces[2], pokerFaces[0], pokerFaces[3], pokerFaces[1])) |
|| (_24 == calculateAll(pokerFaces[2], pokerFaces[1], pokerFaces[0], pokerFaces[3])) |
|| (_24 == calculateAll(pokerFaces[2], pokerFaces[1], pokerFaces[3], pokerFaces[0])) |
|| (_24 == calculateAll(pokerFaces[2], pokerFaces[3], pokerFaces[0], pokerFaces[1])) |
|| (_24 == calculateAll(pokerFaces[2], pokerFaces[3], pokerFaces[1], pokerFaces[0])) |
|| (_24 == calculateAll(pokerFaces[3], pokerFaces[0], pokerFaces[2], pokerFaces[1])) |
|| (_24 == calculateAll(pokerFaces[3], pokerFaces[0], pokerFaces[1], pokerFaces[2])) |
|| (_24 == calculateAll(pokerFaces[3], pokerFaces[1], pokerFaces[0], pokerFaces[2])) |
|| (_24 == calculateAll(pokerFaces[3], pokerFaces[1], pokerFaces[2], pokerFaces[0])) |
|| (_24 == calculateAll(pokerFaces[3], pokerFaces[2], pokerFaces[0], pokerFaces[1])) |
|| (_24 == calculateAll(pokerFaces[3], pokerFaces[2], pokerFaces[1], pokerFaces[0])); |
} |
private double calculateAll(double i, double l, double m, double n) { |
if (_24 == i + calculateLast3(_24 - i, l, m, n)) { |
partOne.push(i); |
partOne.push('+'); |
return _24; |
} |
if (_24 == i - calculateLast3(i - _24, l, m, n)) { |
partOne.push(i); |
partOne.push('-'); |
return _24; |
} |
if (_24 == calculateLast3(i + _24, l, m, n) - i) { |
partThree.push('-'); |
partThree.push(i); |
return _24; |
} |
if (_24 == i * calculateLast3(_24 / i, l, m, n)) { |
partOne.push(i); |
partOne.push('*'); |
return _24; |
} |
if (_24 == i / calculateLast3(i / _24, l, m, n)) { |
partOne.push(i); |
partOne.push('/'); |
return _24; |
} |
if (_24 == calculateLast3(i * _24, l, m, n) / i) { |
partThree.push('/'); |
partThree.push(i); |
return _24; |
} |
return Double.NaN; |
} |
private double calculateLast3(double i, double l, double m, double n) { |
if (i == l + calculateLast2(i - l, m, n)) { |
partTwo.push('('); |
partTwo.push(l); |
partTwo.push('+'); |
partThree.push(')'); |
return i; |
} |
if (i == l - calculateLast2(l - i, m, n)) { |
partTwo.push('('); |
partTwo.push(l); |
partTwo.push('-'); |
partThree.push(')'); |
return i; |
} |
if (i == calculateLast2(l + i, m, n) - l) { |
partTwo.push('('); |
partThree.push('-'); |
partThree.push(l); |
partThree.push(')'); |
return i; |
} |
if (i == l * calculateLast2(i / l, m, n)) { |
partTwo.push(l); |
partTwo.push('*'); |
return i; |
} |
if (i == l / calculateLast2(l / i, m, n)) { |
partTwo.push('('); |
partTwo.push(l); |
partTwo.push('/'); |
partThree.push(')'); |
return i; |
} |
if (i == calculateLast2(l / i, m, n) / l) { |
partTwo.push('('); |
partThree.push('/'); |
partThree.push(l); |
partThree.push(')'); |
return i; |
} |
return Double.NaN; |
} |
private double calculateLast2(double d, double m, double n) { |
if (d == m + n) { |
partThree.push('('); |
partThree.push(m); |
partThree.push('+'); |
partThree.push(n); |
partThree.push(')'); |
return d; |
} |
if (d == m - n) { |
partThree.push('('); |
partThree.push(m); |
partThree.push('-'); |
partThree.push(n); |
partThree.push(')'); |
return d; |
} |
if (d == m * n) { |
partThree.push(m); |
partThree.push('*'); |
partThree.push(n); |
return d; |
} |
if (d == m / n) { |
partThree.push('('); |
partThree.push(m); |
partThree.push('/'); |
partThree.push(n); |
partThree.push(')'); |
return d; |
} |
return Double.NaN; |
} |
|
public String getSolution() { |
return (partOne.toString() + partTwo.toString() + partThree.toString()) |
.replace("[", "").replace("]", "").replace(",", ""); |
} |
/** |
* 测试入口 |
* |
* @param args |
*/ |
public static void main(String[] args) { |
Game24 game = new Game24(); |
System.out.println(game.hasSolution() == true ? "解为: " + game.getSolution() : "无解"); |
} |
} |



