题解 | #24点游戏算法#

非常典型的一道dfs的题,通过dfs递归调用解决遍历问题。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            boolean enable = false;  // 保存是否已经找到等于24的表达式
            int[] nums = new int[4];  // 存储4个数字
            boolean[] visit = new boolean[4];  // 存储4个数字的访问状态
            String[] arr = sc.nextLine().trim().split(" ");
            for (int i = 0; i < 4; i++) {
                nums[i] = Integer.parseInt(arr[i]);
            }
            
            for (int i = 0; i < 4; i++) {
                visit[i] = true;
                if (dfs(nums, visit, nums[i])) {
                    enable = true;
                    break;
                }
            }
            System.out.println(enable);
        }
    }
    
    public static boolean dfs(int[] nums, boolean[] visit, int tmp) {
        for (int i = 0; i < nums.length; i++) {
            if (!visit[i]) {
                visit[i] = true;  // 将一个未访问过的位置置于访问状态
                // 递归调用dfs,本质就是暴力搜索
                if (dfs(nums, visit, tmp - nums[i])
                    || dfs(nums, visit, tmp + nums[i])
                    || dfs(nums, visit, tmp * nums[i])
                    || (tmp % nums[i] == 0 && dfs(nums, visit, tmp - nums[i]))) {
                    return true;
                }
                visit[i] = false;  // 回溯
            }
        }
        if (tmp == 24) {
            return true;
        }
        return false;
    }
}


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务