网友的解法都很复杂,我的思路很简单,就是每次随机从集合中取出两个数字,然后进行加减乘除的运算,得出的结果再放到新的集合中,然后跟剩下没有参与运算的数字继续dfs。直到找到一个等于24的为止。
import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); String[] s = line.split(" "); ArrayList<Double> list = new ArrayList<>(); for (int i = 0; i < 4; i++) { list.add(Double.parseDouble(s[i])); } System.out.println(dfs_HJ67(list)); } /** * 每次从集合中取出两个数字做加减乘除,直到剩余一个数字,返回最后的数字是否等于24点; * * @param nums 需要计算的数字集合 * @return true表示等于24 */ private static boolean dfs_HJ67(ArrayList<Double> nums) { //判断如果nums只剩下一个数字,且结果为24,则通过 if (nums.size() == 1 && nums.get(0).equals(24d)) { return true; } //遍历所有可能性,取出其中两个数字,并进行加减乘除 double num1, num2; for (int i = 0; i < nums.size(); i++) { for (int j = i + 1; j < nums.size(); j++) { //取出两个数字,j的取值范围是[i+1, nums.size()),避免重复计算 num1 = nums.get(i); num2 = nums.get(j); //进行加减乘除运算,返回计算结果集合 List<Double> resultList = calc(num1, num2); //移除这两个数字,剩下的数字参与下一次dfs ArrayList<Double> remainList = new ArrayList<>(nums); remainList.remove(i); remainList.remove(j - 1);//i移除后,j的坐标会往前移动一位 for (Double aDouble : resultList) { ArrayList<Double> newList = new ArrayList<>(remainList); newList.add(aDouble); if (dfs_HJ67(newList)) { return true; } } } } return false; } /** * 两个数字做加减乘除,返回所有的结果集 */ private static List<Double> calc(double num1, double num2) { ArrayList<Double> resultList = new ArrayList<>(); //加法 resultList.add(num1 + num2); //减法 resultList.add(num1 - num2); resultList.add(num2 - num1); //乘法 resultList.add(num1 * num2); //除法,除数不能为0 if (num2 != 0) { resultList.add(num1 / num2); } if (num1 != 0) { resultList.add(num2 / num1); } return resultList; } }