24点游戏

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
Example
输入:
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;
  }
}
一个创业中的苦逼程序员
评论专区

隐藏