思路:

  1. 一开始我们随机生成四个数字A、B、C、D,选择其中任意一个数字,暂记为A;
  2. 将A和B、C、D进行加减乘除运算,并把结果存储起来;
  3. 由于每次都是选择的两张牌,并且最后运算出的结果都是一张牌,所以未知数规模在不断减小;
  4. 反复计算,直到得到24点即可;

实现代码:

package ergodic;
import java.util.*;
/*** @ Author     :heywecome* @ Date       :Created in 14:14 2018/12/21* @ Description:${description}* @ Modified By:* @Version: $version$*/
import java.util.*;public class SolutionOf24 {private int[] num = new int[4]; // 存储最初的四个数字private String solution; // 最终的表达式public boolean judgePoint24(int[] nums) {num = nums;List<Double> list = new ArrayList<>();for (int i : nums) {list.add((double) i);}System.out.println("参与运算的四个值为:"+list.toString());return dfs(list);}// 每次dfs都是选取两张牌private boolean dfs(List<Double> list) {if (list.size() == 1) {// 如果此时list只剩下了一张牌if (Math.abs(list.get(0)- 24.0) < 0.001) {return true;}return false;}// 选取两张牌for(int i = 0; i < list.size(); i++) {for(int j = i + 1; j < list.size(); j++) {// 对于每下一个可能的产生的组合for (double c : compute(list.get(i), list.get(j))) {
//                    System.out.println(c);List<Double> nextRound = new ArrayList<>();// 将他们加入到下一个list循环中去nextRound.add(c);for(int k = 0; k < list.size(); k++) {if(k == j || k == i) continue; // 不可以等于之前的牌nextRound.add(list.get(k)); // 选择出剩余的牌,加入到下一次的循环中}if(dfs(nextRound)) return true;}}}return false;}// 计算下一个可能产生的组合private List<Double> compute(double a, double b) {List<Double> res = Arrays.asList(a+b,a-b,b-a,a*b,a/b,b/a);return res;}/*** 存储运算表达式以及每个结果的值* @param formula* @param temp* @param result*/private void save(String formula,double temp, HashMap<String,Double> result){// 将运算表达式还有结果存储起来result.put(formula,temp);}//根据value值获取到对应的一个key值//此处我本来打算通过存储每个运算过程,并把结果存储,最后通过逆推的方式获得完整的推导过程//由于时间不充分,暂时未实现,待续...public static String getKey(HashMap<String,Double> map,double value) {String key = null;//Map,HashMap并没有实现Iteratable接口.不能用于增强for循环.for (String getKey : map.keySet()) {if (map.get(getKey) == value) {key = getKey; // 要进行判断 这个值是否对应的是四个数字组成的元素String[] temp = key.split("\\+|-|\\*|/");}}return key;//这个key肯定是最后一个满足该条件的key}public static void main(String[] args){int a = (int)(Math.random()*9+1);int b = (int)(Math.random()*9+1);int c = (int)(Math.random()*9+1);int d = (int)(Math.random()*9+1);int[] nums = {a,b,c,d};//        int[] nums = {7,3,9,7};SolutionOf24 solution = new SolutionOf24();System.out.println("是否可以组成24点?"+solution.judgePoint24(nums));}
}

结果截图:

java通过减治法判断四个数能否生成24点问题相关推荐

  1. Java程序中如何判断一个数是否为素数

    文章目录 一.素数是什么? 二.思考步骤 1.满足定义:拿一个数看能不能被1和它本身整除,对吗?? 2.先说说1-100以内的素数如何输出: **那么怎么变成判断输入的一个数是不是素数呢??** 总结 ...

  2. Java实现8枚硬币问题(减治法)

    1 问题描述 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币. 2.1 减 ...

  3. 减治法在生成子集问题中的应用(JAVA)--递归、二进制反射格雷码

    减治法在生成组合对象问题中的应用 生成子集问题:经典的背包问题就是求解一个最优子集的问题,这里我们来讨论一个更简单的问题.对于任意一个集合来说,它都存在2^n个子集(一个集合所有的子集集合称为幂集). ...

  4. 减治法解决约瑟夫斯问题(JAVA)

    减治法在查找算法中的应用 问题背景:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被 ...

  5. 减治法在生成全排列中的应用(JAVA)--回溯、Johnson-Trotter算法、自字典序

    减治法在生成组合对象问题中的应用 在深入浅出讲算法思想--蛮力法思想分析及应用这篇文章的最优解问题中中已经初步讲解了这类应用,下面我们将使用减治法再次思考这类问题. 1.全排列问题,在数学中求解一个n ...

  6. 减治法在查找算法中的应用(JAVA)--快速查找

    减治法在查找算法中的应用 快速查找:选择问题是求一个n个数列表的第k个最小元素的问题,这个数k被称为顺序统计量.对于k=1或k=n来说,这并没有什么意义,我们通常会要找出这样的元素:该元素比列表中一半 ...

  7. Java判断一个数是不是素数

    [java] view plaincopy import java.util.Scanner; //质数又称素数,是指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数 publi ...

  8. 怎么在Java里辨别小数_求教java中如何判断一个数是不是小数,求详细代码及解释...

    求教java中如何判断一个数是不是小数,求详细代码及解释 关注:62  答案:2  mip版 解决时间 2021-01-29 22:49 提问者孤酒醉人心 2021-01-29 03:13 求教jav ...

  9. Java判断一个数是不是快乐数

    Java判断一个数是不是快乐数 快乐数的定义: 快乐数(happy number)有以下的特性: 在给定的进位制下,该数字所有数位(digits)的平方和,得到的新数再次求所有数位的平方和,如此重复进 ...

最新文章

  1. python 连接mysql数据库
  2. 《黑客与画家》读后感
  3. iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontroller、ffmpeg-AVPlayer)...
  4. 动手动脑之接口与继承
  5. 【树莓派】可能是最简单粗暴的树莓派搭建个人网站教程
  6. 上半年营收超阿迪,相当于2.2个李宁,安踏凭什么?
  7. 【C++】考虑virtual函数以外的其他选择
  8. Linux文件系统不是必须的,而是必要的!
  9. Github:视觉问答最新资源汇总
  10. 关于:程序兼容多种数据库
  11. Import declarations are not supported by current JavaScript version
  12. 高并发服务器逻辑处理瓶颈,如何解决?
  13. php web长时间不操作退出,Ecshop管理员登陆后台后短时间不操作自动退出的解决方法...
  14. 电影海报页面设计Html5,重设100部经典电影海报字体,好设计是这样炼成的!
  15. js实现全国省份下拉
  16. matlab中syms空间问题
  17. JavaSE自学笔记016_Real(多线程)
  18. python中确定两个列表(list)之间是否为子集关系
  19. excel查找空值快捷键_excel定位选取:再谈快捷键Ctrl+G的妙用
  20. java画板之“山峰”

热门文章

  1. Linux下的压缩解压缩
  2. Vue父子组件通信的三种方式 props、@eventName、$on
  3. Java 字符串截取
  4. 解决Eclipse C/C++ 报错:could not be resovled/Unresolved inclusion
  5. MySql数据库从库同步的延迟问题及解决方案
  6. Mysql学习-第二章(组合索引)
  7. iphone 隐藏底部_iPhone 12 Pro新人像模式背后的隐藏谜团
  8. java 创建子类_怎么建立java子类
  9. Excel·VBA单元格区域按颜色求和等计算
  10. AHOI2018游记