网友的解法都很复杂,我的思路很简单,就是每次随机从集合中取出两个数字,然后进行加减乘除的运算,得出的结果再放到新的集合中,然后跟剩下没有参与运算的数字继续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;
}
}

京公网安备 11010502036488号