问题描述:给出4个[0,13]的数值,经过任意加减乘除后得到24.

思路:

假设四个数为a1,a2,a3,a4,其中四个符号为t1,t2,t3,t4。 我们先计算(a1 t1 a2)的得到计算结果a12,再让a12与a3进行t2运算。其余同理。这样我们就得到了一个计算公式:

    (((a1 t1 a2) t2 a3 )t3 a4)

而a1,a2,a3,a4不确定,我们需要得到4个数字的所有可能出现情况,即数字的排列组合。

  1. 总体流程图如下:

    Created with Raphaël 2.2.0开始得到数据排列组合列表得到每一列数据符号运算结果==24结束yesno
  2. 得到数据排列组合列表
private static ArrayList<int[]> Permutation(int[] a) {ArrayList<int[]> arrayList = new ArrayList<>();for (int i = 0; i < 4; i++) {                  //表示第一个下标的排列位置for (int j = 0; j < 4; j++) {               //表示第二个下标的排列位置if (i == j)                                     //这里的if语句都是用来去除重复的排列continue;for (int k = 0; k < 4; k++) {            //表示第三个下标的排列位置if (j == k || k == i)continue;for (int m = 0; m < 4; m++) {//表示第四个下标的排列位置if (m == k || m == j || m == i)continue;int[] b = new int[] { a[i], a[j], a[k], a[m] };//给出一个数组来保存这一次循环的排列再把它加到边长数组中arrayList.add(b);}}}}return arrayList;}
  1. 得到符号并放回结果

getNum(a,b,'+')//计算a+b同理其余也是private static int getNum(int a, int b, char ch) {  // switch (ch) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;}return 0;}
  1. 计算每一种排列的结果
 public static String getPoint24Answer(int[] num) {char[] t = new char[] { '+', '-', '*', '/' };//得到全排列ArrayList<int[]> intlist = Permutation(num); //判断每一种排列的情况for (int z = 0; z < intlist.size(); z++) {int a[] = intlist.get(z);for (int i = 0; i < 4; i++) {//当符号为除号时,判断可不可以整除,如果不可以的就跳过这次循环,余下同理if ((i == 3 && (a[0] % a[1] != 0 || a[1] % a[0] != 0))) {break;}int a12 = getNum(a[0], a[1], t[i]);for (int j = 0; j < 4; j++) {if ((j == 3 && (a12 % a[2] != 0 || a[2] % a12 != 0))) {break;}int a123 = getNum(a12, a[2], t[j]);for (int k = 0; k < 4; k++) {if ((k == 3 && (a123 % a[3] != 0 || a123 % a[3] != 0)))break;int a1234 = getNum(a123, a[3], t[k]);if (a1234 == 24)return "(((" + a[0] + t[i] + a[1] + ")" + t[j] + a[2] + ")" + t[k] + a[3] + ") = 24";}}}}return null;}

全部的代码:

package NoName;import java.util.ArrayList;public class Point24 {private static ArrayList<int[]> Permutation(int[] a) {ArrayList<int[]> arrayList = new ArrayList<>();for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (i == j)continue;for (int k = 0; k < 4; k++) {if (j == k || k == i)continue;for (int m = 0; m < 4; m++) {if (m == k || m == j || m == i)continue;int[] b = new int[] { a[i], a[j], a[k], a[m] };arrayList.add(b);}}}}return arrayList;}private static int getNum(int a, int b, char ch) {switch (ch) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;}return 0;}public static String getPoint24Answer(int[] num) {char[] t = new char[] { '+', '-', '*', '/' };ArrayList<int[]> intlist = Permutation(num);for (int z = 0; z < intlist.size(); z++) {int a[] = intlist.get(z);for (int i = 0; i < 4; i++) {if ((i == 3 && (a[0] % a[1] != 0 || a[1] % a[0] != 0))) {break;}int a12 = getNum(a[0], a[1], t[i]);for (int j = 0; j < 4; j++) {if ((j == 3 && (a12 % a[2] != 0 || a[2] % a12 != 0))) {break;}int a123 = getNum(a12, a[2], t[j]);for (int k = 0; k < 4; k++) {if ((k == 3 && (a123 % a[3] != 0 || a123 % a[3] != 0)))break;int a1234 = getNum(a123, a[3], t[k]);if (a1234 == 24)return "(((" + a[0] + t[i] + a[1] + ")" + t[j] + a[2] + ")" + t[k] + a[3] + ") = 24";}}}}return null;}public static void main(String[] args) {System.out.println(getPoint24Answer(new int[] { 3, 4, 8, 10 }));}
}

最简单易懂的24点解法(Java实现)相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java

    <LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...

  2. 【蓝桥杯VIP】试题 历届试题 带分数(满分 Python解法+Java解法)

    [蓝桥杯VIP]试题 历届试题 带分数(满分 Python解法+Java解法) 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 100 可以表示为带分数的形式:100 = 3 + 6 ...

  3. 24点游戏java_24点游戏动态规划解法(java)

    算法原理参考编程之美1.16章节解法2: 下面是java源码:子问题为S[i] U= Fork(f(x),f(i-x)); import java.util.HashMap; import java. ...

  4. 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全

    从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...

  5. 24点游戏 java实现_java实现24点纸牌游戏

    本文题目为大家分享了java实现24点纸牌游戏的具体代码,供大家参考,具体内容如下 题目 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢 ...

  6. 24点游戏---java编写

    24点游戏 前言 1. 算法分析  1 .1 接收玩家结果输入与结果判定.  1.2 工具类TimeUtils.CardUtils.  1.3 数据生成与结果计算. 2. 概要设计 2.1 结构设计 ...

  7. 凑零钱问题的三种解法(Java)

    文章目录 问题描述: 1.递归解法 2.带备忘录的递归解法 3.dp数组动态规划解法 问题描述: 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并 ...

  8. 蓝桥杯国赛-矩阵计数三种解法-java实现

    题目提交 code 1. dfs暴力搜索 深搜所有状态,填X时要判断是否可行,没啥可说,暴力就完了,不过居然能过,规模确实小. import java.util.Scanner;//暴搜居然过 pub ...

  9. hdu1181变形课dfs/bfs/并查集三种解法(java)

    题目链接 Problem Description 呃-变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...

最新文章

  1. 卷积神经网络(CNN)数学原理解析
  2. 界面Hello world
  3. 从编译到执行,C++如何开发SIMD友好的代码?
  4. 用终端命令(Git)合并到Master分支等操作
  5. Python爬取网页源码,图片和文字到本地
  6. 自学python能找到工作吗-自学Python好找工作吗?
  7. apache   和Tomcat的区别
  8. [置顶] 高效前端优化工具--Fiddler入门教程
  9. 外语学习的真实方法及误区(描述得非常深刻)
  10. Comparator.comparing比较排序
  11. 人类一败涂地苹果版_所有游戏联机教程/虚拟局域网/MC联机教程/基岩版联机教程/MC盗版联机教程...
  12. 机器学习笔记 - 使用Keras和深度学习进行乳腺癌分类
  13. 计算机视觉中的小样本学习综述
  14. VRRP 虚拟路由器冗余协议实现双组双备
  15. 互联网大厂面试考点————设计模式
  16. 渗透测试情报收集工具
  17. bs84c12引脚_最新BS84B12A-3.pdf
  18. township android,township无限绿钞最新版-township无限绿钞安卓版下载-西西安卓游戏...
  19. FreeNAS安装过程
  20. FontAwesome图标字体库和CSS框架

热门文章

  1. 互联网+鸡汤=网红,致敬去伪存真的全媒体时代
  2. AutoHotkey版Warkey编制
  3. 实用 | 利用 aardio 配合 Python 快速开发桌面应用
  4. 论文阅读:Synthesizing Obama: Learning Lip Sync from Audio
  5. javaStruct - 通讯协议的解封包第三方库--(二)官方文档三
  6. launcher 总结
  7. Android 扇形图
  8. 阿里集团副总裁语嫣,拜托别把这名字给玷污了行吗
  9. 给图片加水印的代码java_Java为图片加水印的代码
  10. C#处理excel引用Microsoft.Office.Interop.Excel