鱼C论坛

 找回密码
 立即注册
查看: 970|回复: 5

[已解决]求哪位大佬好心帮帮忙

[复制链接]
发表于 2023-9-15 16:40:50 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
计算扑克牌的24点,给4张牌,是否有解?有解时,计算表达式
最佳答案
2023-9-15 16:51:23
抹陳抹陳!! 发表于 2023-9-15 16:48
忘记说语言了 是用Java写的

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

  1. import java.util.ArrayList;
  2. import java.util.List;

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

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

  17.     public static List<String> calculate24Points(int[] nums) {
  18.         List<String> result = new ArrayList<>();
  19.         double[] arr = new double[nums.length];
  20.         for (int i = 0; i < nums.length; i++) {
  21.             arr[i] = nums[i];
  22.         }
  23.         calculate(arr, "", result);
  24.         return result;
  25.     }

  26.     private static void calculate(double[] arr, String expression, List<String> result) {
  27.         if (arr.length == 1) {
  28.             if (Math.abs(arr[0] - 24) < EPSILON) {
  29.                 result.add(expression);
  30.             }
  31.             return;
  32.         }
  33.         for (int i = 0; i < arr.length; i++) {
  34.             for (int j = i + 1; j < arr.length; j++) {
  35.                 double[] nextArr = new double[arr.length - 1];
  36.                 int idx = 0;
  37.                 for (int k = 0; k < arr.length; k++) {
  38.                     if (k != i && k != j) {
  39.                         nextArr[idx++] = arr[k];
  40.                     }
  41.                 }
  42.                 // 加法
  43.                 nextArr[idx] = arr[i] + arr[j];
  44.                 calculate(nextArr, "(" + expression + "+" + (int) arr[i] + "+" + (int) arr[j] + ")", result);
  45.                 // 减法
  46.                 nextArr[idx] = arr[i] - arr[j];
  47.                 calculate(nextArr, "(" + expression + "+" + (int) arr[i] + "-" + (int) arr[j] + ")", result);
  48.                 nextArr[idx] = arr[j] - arr[i];
  49.                 calculate(nextArr, "(" + expression + "+" + (int) arr[j] + "-" + (int) arr[i] + ")", result);
  50.                 // 乘法
  51.                 nextArr[idx] = arr[i] * arr[j];
  52.                 calculate(nextArr, "(" + expression + "+" + (int) arr[i] + "*" + (int) arr[j] + ")", result);
  53.                 // 除法
  54.                 if (Math.abs(arr[j]) > EPSILON) {
  55.                     nextArr[idx] = arr[i] / arr[j];
  56.                     calculate(nextArr, "(" + expression + "+" + (int) arr[i] + "/" + (int) arr[j] + ")", result);
  57.                 }
  58.                 if (Math.abs(arr[i]) > EPSILON) {
  59.                     nextArr[idx] = arr[j] / arr[i];
  60.                     calculate(nextArr, "(" + expression + "+" + (int) arr[j] + "/" + (int) arr[i] + ")", result);
  61.                 }
  62.             }
  63.         }
  64.     }
  65. }
复制代码


该程序通过递归的方式,穷举所有可能的表达式,判断是否能计算出24点。如果有解,将解存储在一个列表中,并打印出来。否则,打印"无解"。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-9-15 16:41:12 | 显示全部楼层
首先,我们需要知道24点游戏的规则:给出4张牌,可以使用加、减、乘、除四种运算符以及括号,计算得到24即为胜利。

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

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

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

下面是具体的代码实现:

  1. def calculate(nums):
  2.     if len(nums) == 1:
  3.         if abs(nums[0] - 24) < 1e-6:
  4.             return str(nums[0])
  5.         else:
  6.             return ""
  7.     for i in range(len(nums)):
  8.         for j in range(i + 1, len(nums)):
  9.             new_nums = []
  10.             for k in range(len(nums)):
  11.                 if k != i and k != j:
  12.                     new_nums.append(nums[k])
  13.             # 加法
  14.             new_nums.append(nums[ i] + nums[j])
  15.             if calculate(new_nums):
  16.                 return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "+" + str(nums[j])
  17.             new_nums.pop()
  18.             # 减法
  19.             new_nums.append(nums[ i] - nums[j])
  20.             if calculate(new_nums):
  21.                 return "(" + calculate(new_nums) + ")" + "+" + str(nums[j]) + "-" + str(nums[ i])
  22.             new_nums.pop()
  23.             new_nums.append(nums[j] - nums[ i])
  24.             if calculate(new_nums):
  25.                 return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "-" + str(nums[j])
  26.             new_nums.pop()
  27.             # 乘法
  28.             new_nums.append(nums[ i] * nums[j])
  29.             if calculate(new_nums):
  30.                 return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "*" + str(nums[j])
  31.             new_nums.pop()
  32.             # 除法
  33.             if abs(nums[j]) > 1e-6:
  34.                 new_nums.append(nums[ i] / nums[j])
  35.                 if calculate(new_nums):
  36.                     return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "/" + str(nums[j])
  37.                 new_nums.pop()
  38.             if abs(nums[ i]) > 1e-6:
  39.                 new_nums.append(nums[j] / nums[ i])
  40.                 if calculate(new_nums):
  41.                     return "(" + calculate(new_nums) + ")" + "+" + str(nums[j]) + "/" + str(nums[ i])
  42.                 new_nums.pop()
  43.     return ""
复制代码


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

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

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

希望能够帮到您。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

忘记说语言了 是用Java写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-15 16:51:23 | 显示全部楼层    本楼为最佳答案   
抹陳抹陳!! 发表于 2023-9-15 16:48
忘记说语言了 是用Java写的

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

  1. import java.util.ArrayList;
  2. import java.util.List;

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

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

  17.     public static List<String> calculate24Points(int[] nums) {
  18.         List<String> result = new ArrayList<>();
  19.         double[] arr = new double[nums.length];
  20.         for (int i = 0; i < nums.length; i++) {
  21.             arr[i] = nums[i];
  22.         }
  23.         calculate(arr, "", result);
  24.         return result;
  25.     }

  26.     private static void calculate(double[] arr, String expression, List<String> result) {
  27.         if (arr.length == 1) {
  28.             if (Math.abs(arr[0] - 24) < EPSILON) {
  29.                 result.add(expression);
  30.             }
  31.             return;
  32.         }
  33.         for (int i = 0; i < arr.length; i++) {
  34.             for (int j = i + 1; j < arr.length; j++) {
  35.                 double[] nextArr = new double[arr.length - 1];
  36.                 int idx = 0;
  37.                 for (int k = 0; k < arr.length; k++) {
  38.                     if (k != i && k != j) {
  39.                         nextArr[idx++] = arr[k];
  40.                     }
  41.                 }
  42.                 // 加法
  43.                 nextArr[idx] = arr[i] + arr[j];
  44.                 calculate(nextArr, "(" + expression + "+" + (int) arr[i] + "+" + (int) arr[j] + ")", result);
  45.                 // 减法
  46.                 nextArr[idx] = arr[i] - arr[j];
  47.                 calculate(nextArr, "(" + expression + "+" + (int) arr[i] + "-" + (int) arr[j] + ")", result);
  48.                 nextArr[idx] = arr[j] - arr[i];
  49.                 calculate(nextArr, "(" + expression + "+" + (int) arr[j] + "-" + (int) arr[i] + ")", result);
  50.                 // 乘法
  51.                 nextArr[idx] = arr[i] * arr[j];
  52.                 calculate(nextArr, "(" + expression + "+" + (int) arr[i] + "*" + (int) arr[j] + ")", result);
  53.                 // 除法
  54.                 if (Math.abs(arr[j]) > EPSILON) {
  55.                     nextArr[idx] = arr[i] / arr[j];
  56.                     calculate(nextArr, "(" + expression + "+" + (int) arr[i] + "/" + (int) arr[j] + ")", result);
  57.                 }
  58.                 if (Math.abs(arr[i]) > EPSILON) {
  59.                     nextArr[idx] = arr[j] / arr[i];
  60.                     calculate(nextArr, "(" + expression + "+" + (int) arr[j] + "/" + (int) arr[i] + ")", result);
  61.                 }
  62.             }
  63.         }
  64.     }
  65. }
复制代码


该程序通过递归的方式,穷举所有可能的表达式,判断是否能计算出24点。如果有解,将解存储在一个列表中,并打印出来。否则,打印"无解"。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-15 17:09:44 From FishC Mobile | 显示全部楼层
输出的结果有点看不懂 (((+1+2)+3+4)+4*6)是什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-15 18:10:43 From FishC Mobile | 显示全部楼层
运行的结果不懂 能解释一下吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-11 18:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表