最简单易懂的24点解法(Java实现)
问题描述:给出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个数字的所有可能出现情况,即数字的排列组合。
- 总体流程图如下:
Created with Raphaël 2.2.0开始得到数据排列组合列表得到每一列数据符号运算结果==24结束yesno
- 得到数据排列组合列表
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;}
- 得到符号并放回结果
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;}
- 计算每一种排列的结果
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实现)相关推荐
- 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java
<LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...
- 【蓝桥杯VIP】试题 历届试题 带分数(满分 Python解法+Java解法)
[蓝桥杯VIP]试题 历届试题 带分数(满分 Python解法+Java解法) 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 100 可以表示为带分数的形式:100 = 3 + 6 ...
- 24点游戏java_24点游戏动态规划解法(java)
算法原理参考编程之美1.16章节解法2: 下面是java源码:子问题为S[i] U= Fork(f(x),f(i-x)); import java.util.HashMap; import java. ...
- 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全
从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...
- 24点游戏 java实现_java实现24点纸牌游戏
本文题目为大家分享了java实现24点纸牌游戏的具体代码,供大家参考,具体内容如下 题目 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢 ...
- 24点游戏---java编写
24点游戏 前言 1. 算法分析 1 .1 接收玩家结果输入与结果判定. 1.2 工具类TimeUtils.CardUtils. 1.3 数据生成与结果计算. 2. 概要设计 2.1 结构设计 ...
- 凑零钱问题的三种解法(Java)
文章目录 问题描述: 1.递归解法 2.带备忘录的递归解法 3.dp数组动态规划解法 问题描述: 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并 ...
- 蓝桥杯国赛-矩阵计数三种解法-java实现
题目提交 code 1. dfs暴力搜索 深搜所有状态,填X时要判断是否可行,没啥可说,暴力就完了,不过居然能过,规模确实小. import java.util.Scanner;//暴搜居然过 pub ...
- hdu1181变形课dfs/bfs/并查集三种解法(java)
题目链接 Problem Description 呃-变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...
最新文章
- 卷积神经网络(CNN)数学原理解析
- 界面Hello world
- 从编译到执行,C++如何开发SIMD友好的代码?
- 用终端命令(Git)合并到Master分支等操作
- Python爬取网页源码,图片和文字到本地
- 自学python能找到工作吗-自学Python好找工作吗?
- apache 和Tomcat的区别
- [置顶] 高效前端优化工具--Fiddler入门教程
- 外语学习的真实方法及误区(描述得非常深刻)
- Comparator.comparing比较排序
- 人类一败涂地苹果版_所有游戏联机教程/虚拟局域网/MC联机教程/基岩版联机教程/MC盗版联机教程...
- 机器学习笔记 - 使用Keras和深度学习进行乳腺癌分类
- 计算机视觉中的小样本学习综述
- VRRP 虚拟路由器冗余协议实现双组双备
- 互联网大厂面试考点————设计模式
- 渗透测试情报收集工具
- bs84c12引脚_最新BS84B12A-3.pdf
- township android,township无限绿钞最新版-township无限绿钞安卓版下载-西西安卓游戏...
- FreeNAS安装过程
- FontAwesome图标字体库和CSS框架
热门文章
- 互联网+鸡汤=网红,致敬去伪存真的全媒体时代
- AutoHotkey版Warkey编制
- 实用 | 利用 aardio 配合 Python 快速开发桌面应用
- 论文阅读:Synthesizing Obama: Learning Lip Sync from Audio
- javaStruct - 通讯协议的解封包第三方库--(二)官方文档三
- launcher 总结
- Android 扇形图
- 阿里集团副总裁语嫣,拜托别把这名字给玷污了行吗
- 给图片加水印的代码java_Java为图片加水印的代码
- C#处理excel引用Microsoft.Office.Interop.Excel