-
时海解法很赞,感谢楼主
-
24点游戏是一种使用扑克牌来进行的益智类游戏,游戏内容是:从一副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数(A代表1)运用加、减、乘、除和括号进行运算得出24。每张牌都必须使用一次,但不能重复使用。 简化描述:从1-13个数中,有放回的抽取4个数,判断这4个数是否可以通过运用加、减、乘、除和括号进行运算得出24。 例如:2,4,6,12可以通过以下三种方法计算得到24。 2 + 4 + 6 + 12 = 24 4 × 6 ÷ 2 + 12 = 24 12 ÷ 4 × (6 + 2) = 24
从1-13个数中,有放回抽取的4个数
若这4个数可以通过运用加、减、乘、除和括号进行运算得出24,则返回true,否则返回false
2,4,6,12
true
假设4 个数的集合A={1,2,3,4},
先取前两个数进行不同的四则运算,1+2=3,1-2=-1,2-1=1,1/2=0.5,2/1=2,1x2=2,
将所得的结果递归的与集合A中剩下的进行四则运算,
问题规模从4个变成3个。。。最后变成2个。
import java.util.*; public class Main { double wucha = 1E-6;//浮点除法有精度损失 double num[] = new double[4]; boolean flag;//标记是否成功 void game24(int n){ if (n == 1) { if (Math.abs(num[0] - 24) <= wucha) { flag = true; return; } } if (flag) return; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double a, b; a = num[i]; b = num[j]; num[j] = num[n - 1]; num[i] = a + b; game24(n - 1); num[i] = a - b; game24(n - 1); num[i] = b - a; game24(n - 1); num[i] = a * b; game24(n - 1); if (b != 0) { num[i] = a / b; game24(n - 1); } if (a != 0) { num[i] = b / a; game24(n - 1); } num[i] = a; num[j] = b; } } } public boolean solution(int[] input) { for (int i = 0; i < 4; i++) { num[i] = (double)input[i]; } flag = false; game24(4); return flag; } }