[Daily Practice] -24点游戏判断成立与计算公式打印

    技术2025-01-17  13

    问题描述

    输入一行数字,以一个空格隔开,每行4个数字,判断用这4个数字进行加减乘除运算,最终能否得到24,如果能,则输出YES 并输出计算公式,如果不能得到24,则输出NO。

    读题

    例: 输入:

    1 5 5 5

    输出:

    (5-(1/5))*5 YES

    代码

    public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String input = null; while ((input = in.readLine()) != null && !"".equals(input)) { String[] factors = input.split(" "); double[] array = new double[4]; for (int i = 0; i < 4; i++) { array[i] = Double.parseDouble(factors[i]); } if (dfs(array, 4, "")) { System.out.println("YES"); } else { System.out.println("NO"); } } } private static boolean dfs(double[] num, int s, String str) { if (s == 1) { if (Math.abs(num[0] - 24) == 0) { print(str); return true; } else { return false; } } double a; double b; for (int i = 0; i < s; i++) { for (int j = i + 1; j < s; j++) { a = num[i]; b = num[j]; num[j] = num[s - 1]; num[i] = a + b; if (dfs(num, s - 1, str + "," + a + "+" + b)) { return true; } num[i] = a - b; if (dfs(num, s - 1, str + "," + a + "-" + b)) { return true; } num[i] = b - a; if (dfs(num, s - 1, str + "," + b + "-" + a)) { return true; } num[i] = a * b; if (dfs(num, s - 1, str + "," + a + "*" + b)) { return true; } if (b != 0) { num[i] = a / b; } if (dfs(num, s - 1, str + "," + a + "/" + b)) { return true; } if (a != 0) { num[i] = b / a; } if (dfs(num, s - 1, str + "," + b + "/" + a)) { return true; } num[i] = a; num[j] = b; } } return false; } /************************** 以上为判断是否成立部分*************************** * 这是一条华丽的分割线 * ************************** 以下为打印公式部分*******************************/ private static void print(String str) { String[] strArr = str.split(","); double a = cal(strArr[1]); double b = cal(strArr[2]); if (strArr[2].contains(String.valueOf(a))) { strArr[2] = strArr[2].replace(String.valueOf(a), "(" + strArr[1] + ")"); } if (strArr[3].contains(String.valueOf(b))) { strArr[3] = strArr[3].replace(String.valueOf(b), "(" + strArr[2] + ")"); } if (strArr[3].contains(String.valueOf(a))) { strArr[3] = strArr[3].replace(String.valueOf(a), "(" + strArr[1] + ")"); } System.out.println(strArr[3].replace(".0","")); } private static double cal(String s) { if (s.contains("+")) { String[] split = s.split("\\+"); return Double.valueOf(split[0]) + Double.valueOf(split[1]); } if (s.contains("-")) { String[] split = s.split("-"); return Double.valueOf(split[0]) - Double.valueOf(split[1]); } if (s.contains("*")) { String[] split = s.split("\\*"); return Double.valueOf(split[0]) * Double.valueOf(split[1]); } if (s.contains("/")) { String[] split = s.split("/"); return Double.valueOf(split[0]) / Double.valueOf(split[1]); } return 0; }

    测试结果

    Processed: 0.009, SQL: 9