求哪位大佬好心帮帮忙
计算扑克牌的24点,给4张牌,是否有解?有解时,计算表达式 首先,我们需要知道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点,如果可以,返回表达式,否则返回空。
希望能够帮到您。 isdkz 发表于 2023-9-15 16:41
首先,我们需要知道24点游戏的规则:给出4张牌,可以使用加、减、乘、除四种运算符以及括号,计算得到24即 ...
忘记说语言了 是用Java写的 抹陳抹陳!! 发表于 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点。如果有解,将解存储在一个列表中,并打印出来。否则,打印"无解"。 输出的结果有点看不懂 (((+1+2)+3+4)+4*6)是什么意思? 运行的结果不懂 能解释一下吗
页:
[1]