抹陳抹陳!! 发表于 2023-9-15 16:40:50

求哪位大佬好心帮帮忙

计算扑克牌的24点,给4张牌,是否有解?有解时,计算表达式

isdkz 发表于 2023-9-15 16:41:12

首先,我们需要知道24点游戏的规则:给出4张牌,可以使用加、减、乘、除四种运算符以及括号,计算得到24即为胜利。

针对这个问题,我们可以使用递归的方式来解决。具体步骤如下:

1. 首先,我们从4张牌中任选两张牌,进行加、减、乘、除四种运算操作,得到一个新的数字,然后将这个新数字与剩下的两张牌一起递归调用自身,直到剩下的牌不足两张。

2. 当剩下的牌不足两张时,我们判断这两张牌是否能够得到24点。如果可以得到24点,则返回表达式,否则返回空。

下面是具体的代码实现:

def calculate(nums):
    if len(nums) == 1:
      if abs(nums - 24) < 1e-6:
            return str(nums)
      else:
            return ""
    for i in range(len(nums)):
      for j in range(i + 1, len(nums)):
            new_nums = []
            for k in range(len(nums)):
                if k != i and k != j:
                  new_nums.append(nums)
            # 加法
            new_nums.append(nums[ i] + nums)
            if calculate(new_nums):
                return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "+" + str(nums)
            new_nums.pop()
            # 减法
            new_nums.append(nums[ i] - nums)
            if calculate(new_nums):
                return "(" + calculate(new_nums) + ")" + "+" + str(nums) + "-" + str(nums[ i])
            new_nums.pop()
            new_nums.append(nums - nums[ i])
            if calculate(new_nums):
                return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "-" + str(nums)
            new_nums.pop()
            # 乘法
            new_nums.append(nums[ i] * nums)
            if calculate(new_nums):
                return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "*" + str(nums)
            new_nums.pop()
            # 除法
            if abs(nums) > 1e-6:
                new_nums.append(nums[ i] / nums)
                if calculate(new_nums):
                  return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "/" + str(nums)
                new_nums.pop()
            if abs(nums[ i]) > 1e-6:
                new_nums.append(nums / nums[ i])
                if calculate(new_nums):
                  return "(" + calculate(new_nums) + ")" + "+" + str(nums) + "/" + str(nums[ i])
                new_nums.pop()
    return ""


在上述代码中,我们首先判断牌的数量是否为1,如果是,判断是否能够得到24点,如果可以,返回表达式,否则返回空。

如果牌的数量不足1,我们任选两张牌进行加、减、乘、除四种运算操作,并将得到的新数字与剩下的牌一起递归调用自身,直到牌的数量不足2。

最后,我们判断是否能够得到24点,如果可以,返回表达式,否则返回空。

希望能够帮到您。

抹陳抹陳!! 发表于 2023-9-15 16:48:43

isdkz 发表于 2023-9-15 16:41
首先,我们需要知道24点游戏的规则:给出4张牌,可以使用加、减、乘、除四种运算符以及括号,计算得到24即 ...

忘记说语言了 是用Java写的

isdkz 发表于 2023-9-15 16:51:23

抹陳抹陳!! 发表于 2023-9-15 16:48
忘记说语言了 是用Java写的

以下是一个计算扑克牌24点的Java程序:

import java.util.ArrayList;
import java.util.List;

public class Poker24Points {
    private static final double EPSILON = 1e-6; // 用于比较浮点数的误差

    public static void main(String[] args) {
      int[] nums = {1, 2, 3, 4}; // 输入4张牌的数字
      List<String> result = calculate24Points(nums);
      if (result.isEmpty()) {
            System.out.println("无解");
      } else {
            System.out.println("有解,计算表达式如下:");
            for (String expression : result) {
                System.out.println(expression);
            }
      }
    }

    public static List<String> calculate24Points(int[] nums) {
      List<String> result = new ArrayList<>();
      double[] arr = new double;
      for (int i = 0; i < nums.length; i++) {
            arr = nums;
      }
      calculate(arr, "", result);
      return result;
    }

    private static void calculate(double[] arr, String expression, List<String> result) {
      if (arr.length == 1) {
            if (Math.abs(arr - 24) < EPSILON) {
                result.add(expression);
            }
            return;
      }
      for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                double[] nextArr = new double;
                int idx = 0;
                for (int k = 0; k < arr.length; k++) {
                  if (k != i && k != j) {
                        nextArr = arr;
                  }
                }
                // 加法
                nextArr = arr + arr;
                calculate(nextArr, "(" + expression + "+" + (int) arr + "+" + (int) arr + ")", result);
                // 减法
                nextArr = arr - arr;
                calculate(nextArr, "(" + expression + "+" + (int) arr + "-" + (int) arr + ")", result);
                nextArr = arr - arr;
                calculate(nextArr, "(" + expression + "+" + (int) arr + "-" + (int) arr + ")", result);
                // 乘法
                nextArr = arr * arr;
                calculate(nextArr, "(" + expression + "+" + (int) arr + "*" + (int) arr + ")", result);
                // 除法
                if (Math.abs(arr) > EPSILON) {
                  nextArr = arr / arr;
                  calculate(nextArr, "(" + expression + "+" + (int) arr + "/" + (int) arr + ")", result);
                }
                if (Math.abs(arr) > EPSILON) {
                  nextArr = arr / arr;
                  calculate(nextArr, "(" + expression + "+" + (int) arr + "/" + (int) arr + ")", result);
                }
            }
      }
    }
}


该程序通过递归的方式,穷举所有可能的表达式,判断是否能计算出24点。如果有解,将解存储在一个列表中,并打印出来。否则,打印"无解"。

抹陳抹陳!! 发表于 2023-9-15 17:09:44

输出的结果有点看不懂 (((+1+2)+3+4)+4*6)是什么意思?

抹陳抹陳!! 发表于 2023-9-15 18:10:43

运行的结果不懂 能解释一下吗
页: [1]
查看完整版本: 求哪位大佬好心帮帮忙