题解 | #24点游戏算法#
24点游戏算法
https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { // 标准输入 Scanner input = new Scanner(System.in); // 获取输入数组 while (input.hasNextLine()) { String[] numStr = input.nextLine().split(" "); // 将字符串数组转成双浮点数组后再处理 double[] nums = new double[numStr.length]; for (int i = 0; i < numStr.length; i++) { nums[i] = Double.parseDouble(numStr[i]); } // 调用解析方法 boolean ans = judgePoint24(nums); // 输出结果 System.out.println(ans); } } // 使用递归判断输入数组能否计算出24点 private static boolean judgePoint24(double[] nums) { // 设置递归出口 if (nums.length == 1) { // 处理计算精度问题 return nums[0] > 23.999 && nums[0] < 24.001; } // 任选两数,通过运算符组成第三个数,进行后续的24点运算 // 此处不需考虑括号问题,因为是任选两数后所有运算符都参与,故有无括号的情况均包含在内 for (int x = 0; x < nums.length - 1; x++) { for (int y = x + 1; y < nums.length; y++) { // 初始化标志位,记录是否能算出24 boolean isValid = false; // 每次两数操作后,得到的新数组length-1 // 删除两操作数中的后者,然后在前者的位置放置新得的运算结果 double[] temp = new double[nums.length - 1]; //copy待删除元素y的前部 System.arraycopy(nums, 0, temp, 0, y); //copy待删除元素y的后部 System.arraycopy(nums, y + 1, temp, y, temp.length - y); // 加法 temp[x] = nums[x] + nums[y]; isValid = isValid || judgePoint24(temp); // 减法(减与被减) temp[x] = nums[x] - nums[y]; isValid = isValid || judgePoint24(temp); temp[x] = nums[y] - nums[x]; isValid = isValid || judgePoint24(temp); // 乘法 temp[x] = nums[x] * nums[y]; isValid = isValid || judgePoint24(temp); // 除法(除与被除),除数不得为0 if (nums[y] != 0) { temp[x] = nums[x] / nums[y]; isValid = isValid || judgePoint24(temp); } if (nums[x] != 0) { temp[x] = nums[y] / nums[x]; isValid = isValid || judgePoint24(temp); } // 计算完毕,若合法则返回 if (isValid) { return true; } } } // 双层循环结束 // 不合法 return false; } }