鱼C论坛

 找回密码
 立即注册
查看: 606|回复: 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程序:
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[nums.length];
        for (int i = 0; i < nums.length; i++) {
            arr[i] = nums[i];
        }
        calculate(arr, "", result);
        return result;
    }

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

该程序通过递归的方式,穷举所有可能的表达式,判断是否能计算出24点。如果有解,将解存储在一个列表中,并打印出来。否则,打印"无解"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

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

下面是具体的代码实现:
def calculate(nums):
    if len(nums) == 1:
        if abs(nums[0] - 24) < 1e-6:
            return str(nums[0])
        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[k])
            # 加法
            new_nums.append(nums[ i] + nums[j])
            if calculate(new_nums):
                return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "+" + str(nums[j])
            new_nums.pop()
            # 减法
            new_nums.append(nums[ i] - nums[j])
            if calculate(new_nums):
                return "(" + calculate(new_nums) + ")" + "+" + str(nums[j]) + "-" + str(nums[ i])
            new_nums.pop()
            new_nums.append(nums[j] - nums[ i])
            if calculate(new_nums):
                return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "-" + str(nums[j])
            new_nums.pop()
            # 乘法
            new_nums.append(nums[ i] * nums[j])
            if calculate(new_nums):
                return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "*" + str(nums[j])
            new_nums.pop()
            # 除法
            if abs(nums[j]) > 1e-6:
                new_nums.append(nums[ i] / nums[j])
                if calculate(new_nums):
                    return "(" + calculate(new_nums) + ")" + "+" + str(nums[ i]) + "/" + str(nums[j])
                new_nums.pop()
            if abs(nums[ i]) > 1e-6:
                new_nums.append(nums[j] / nums[ i])
                if calculate(new_nums):
                    return "(" + calculate(new_nums) + ")" + "+" + str(nums[j]) + "/" + str(nums[ i])
                new_nums.pop()
    return ""

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

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

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

希望能够帮到您。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

忘记说语言了 是用Java写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[nums.length];
        for (int i = 0; i < nums.length; i++) {
            arr[i] = nums[i];
        }
        calculate(arr, "", result);
        return result;
    }

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

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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2023-9-15 18:10:43 From FishC Mobile | 显示全部楼层
运行的结果不懂 能解释一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 22:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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