题解 | #24点运算#

24点运算

https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d

import java.util.*;

public class Main {
    static String[] arrStr;
    static int[] arr;
    static boolean[] booleans;
    static ArrayList<String> list;
    static ArrayList<String> tempList;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input = in.nextLine();
        arrStr = input.split(" ");
        arr = new int[4];
        booleans = new boolean[4];
        list = new ArrayList<>();
        tempList = new ArrayList<>();
        for (int i = 0; i < arrStr.length; i++) {
            if (arrStr[i].equals("joker") || arrStr[i].equals("JOKER")) {
                System.out.println("ERROR");
                System.exit(0);
            } else {
                arr[i] = getNum(arrStr[i]);
            }
        }
        dfs(0, 0);
        if (list.size() == 0) {
            System.out.println("NONE");
        } else {
            System.out.println(list.get(0));
        }
    }

    private static void dfs(int index, int sum) {
        //边界条件
        if (index == 3) {
            if (sum == 24) {
                String temp = "";
                for (int i = 0; i < tempList.size(); i++) {
                    temp += tempList.get(i);
                }
                list.add(temp);
            }
            return;
        }

        //搜索
        if (index == 0) {
            for (int i = 0; i < 4; i++) {
                for (int j = i + 1; j < 4; j++) {
                    for (int k = 0; k < 6; k++) {
                        switch (k) {
                            case 0:
                                booleans[i] = true;
                                booleans[j] = true;
                                tempList.add(arrStr[i] + "+" + arrStr[j]);
                                dfs(index + 1, arr[i] + arr[j]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                booleans[j] = false;
                                break;
                            case 1:
                                booleans[i] = true;
                                booleans[j] = true;
                                tempList.add(arrStr[i] + "-" + arrStr[j]);
                                dfs(index + 1, arr[i] - arr[j]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                booleans[j] = false;
                                break;
                            case 2:
                                booleans[i] = true;
                                booleans[j] = true;
                                tempList.add(arrStr[i] + "*" + arrStr[j]);
                                dfs(index + 1, arr[i] * arr[j]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                booleans[j] = false;
                                break;
                            case 3:
                                booleans[i] = true;
                                booleans[j] = true;
                                tempList.add(arrStr[i] + "/" + arrStr[j]);
                                dfs(index + 1, arr[i] / arr[j]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                booleans[j] = false;
                                break;
                            case 4:
                                booleans[i] = true;
                                booleans[j] = true;
                                tempList.add(arrStr[j] + "/" + arrStr[i]);
                                dfs(index + 1, arr[j] / arr[i]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                booleans[j] = false;
                                break;
                            case 5:
                                booleans[i] = true;
                                booleans[j] = true;
                                tempList.add(arrStr[j] + "-" + arrStr[i]);
                                dfs(index + 1, arr[j] - arr[i]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                booleans[j] = false;
                                break;
                        }
                    }
                }
            }
        } else {
            for (int i = 0; i < 4; i++) {
                if (!booleans[i]) {
                    for (int k = 0; k < 4; k++) {
                        switch (k) {
                            case 0:
                                booleans[i] = true;
                                tempList.add("+" + arrStr[i]);
                                dfs(index + 1, sum + arr[i]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                break;
                            case 1:
                                booleans[i] = true;
                                tempList.add("-" + arrStr[i]);
                                dfs(index + 1, sum - arr[i]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                break;
                            case 2:
                                booleans[i] = true;
                                tempList.add("*" + arrStr[i]);
                                dfs(index + 1, sum * arr[i]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                break;
                            case 3:
                                booleans[i] = true;
                                tempList.add("/" + arrStr[i]);
                                dfs(index + 1, sum / arr[i]);
                                tempList.remove(tempList.size() - 1);
                                booleans[i] = false;
                                break;
                        }
                    }
                }
            }
        }
    }

    private static int getNum(String s) {
        switch (s) {
            case "2":
                return 2;
            case "3":
                return 3;
            case "4":
                return 4;
            case "5":
                return 5;
            case "6":
                return 6;
            case "7":
                return 7;
            case "8":
                return 8;
            case "9":
                return 9;
            case "10":
                return 10;
            case "J":
                return 11;
            case "Q":
                return 12;
            case "K":
                return 13;
            case "A":
                return 1;
            default:
                return -1;
        }
    }
}

解题思路:

1, 采用深度搜索的方法, 对各个计算方案进行遍历;

2, 分析最终的结果集, 并进行输出

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务