【华为OJ】【算法总篇章】


【华为OJ】【097-24点游戏算法】

【工程下载】


题目描述

给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
输入:
4个1-10的数字。[数字允许重复,测试用例保证无异常数字]
输出:
true or false

输入描述

输入4个int整数

输出描述

返回能否得到24点,能输出true,不能输出false

输入例子

7 2 1 10

输出例子

true

算法实现

import java.util.LinkedList;
import java.util.Scanner;/*** Author: 王俊超* Date: 2016-05-04 12:09* CSDN: http://blog.csdn.net/derrantcm* Github: https://github.com/Wang-Jun-Chao* Declaration: All Rights Reserved !!!*/
public class Main {public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));while (scanner.hasNext()) {int a = scanner.nextInt();int b = scanner.nextInt();int c = scanner.nextInt();int d = scanner.nextInt();System.out.println(game24Points(a, b, c, d));}scanner.close();}// a, b, c, d都在[1, 10]内/*** 4个[1, 10]的能否通过加减乘除,得到数字为24** @param a 第一个数字* @param b 第二个数字* @param c 第三个数字* @param d 第四个数字* @return true,可以组成24,false不可以组成24*/private static boolean game24Points(int a, int b, int c, int d) {int[] arr = {a, b, c, d, '+', '-', '*', '/'};boolean[] used = new boolean[arr.length];LinkedList<Integer> list = new LinkedList<Integer>();boolean[] rst = {false};// 构造组合的逆波兰表达式for (int i = 0; i < 4; i++) {used[i] = true;list.add(arr[i]);to24(arr, used, 1, 0, list, rst);if (rst[0]) {return true;}// 现场还原list.removeLast();used[i] = false;}return false;}/*** 4个[1, 10]的能否通过加减乘除,得到数字为24** @param arr    能够使用的操作数、操作符的数组* @param used   已经使用的操作数、操作符标记数组* @param numCnt 操作数的个数* @param optCnt 操作符的个数* @param list   求得的逆波兰式* @param rst    保存中间结果,有满足24的就停止计算*/private static void to24(int[] arr, boolean[] used, int numCnt, int optCnt,LinkedList<Integer> list, boolean[] rst) {// 如果已经找到答案就不进行操作了if (rst[0]) {return;}// 已经完成了逆波兰式的构造if (numCnt > optCnt && numCnt + optCnt == 7) {calInversePoland(list, rst);}// 还要构造逆波兰式else if (numCnt > optCnt) {for (int i = 0; i < arr.length; i++) {// 如果arr[i]还没有被使用过,或者arr[i]是运算符if (!used[i] || arr[i] < 0 || arr[i] > 10) {// 如果是数字if (arr[i] >= 0 && arr[i] <= 10) {list.add(arr[i]);numCnt++;used[i] = true;to24(arr, used, numCnt, optCnt, list, rst);// 找到了一个答案就返回if (rst[0]) {return;}list.removeLast();numCnt--;used[i] = false;}// 如果是操作符,则放入arr[i]之前,操作数必须比操作符多两个else if (numCnt + 1 > optCnt) {list.add(arr[i]);optCnt++;used[i] = true;to24(arr, used, numCnt, optCnt, list, rst);// 找到了一个答案就返回if (rst[0]) {return;}list.removeLast();optCnt--;used[i] = false;}}}}}/*** 计算逆波兰式的值** @param list 逆波兰式* @param rst  用于保存计算结果*/private static void calInversePoland(LinkedList<Integer> list, boolean[] rst) {LinkedList<Double> stack = new LinkedList<>();for (int v : list) {// 如果是数字if (v >= 0 && v <= 10) {stack.add((double)v);} else {double a = stack.removeLast();double b = stack.removeLast();double c = 0;switch ((char) v) {case '+':c = a + b;break;case '-':c = a - b;break;case '*':c = a * b;break;case '/':// 除数不能为0if (a == 0) {return;}c = b / a;break;}stack.add(c);}}rst[0] = stack.getFirst() == 24.0;}}

【华为OJ】【097-24点游戏算法】相关推荐

  1. [华为机试练习题]44.24点游戏算法

    题目 注意: 6 + 2 * 4 + 10 = 24 不是一个数字一个数字的计算 代码 /*--------------------------------------- * 日期:2015-07-0 ...

  2. ACM. HJ67 24点游戏算法 679. 24 点游戏

    HJ67 24点游戏算法 ●● 679. 24点游戏 ●●● 描述 给定一个长度为4的整数数组 cards .你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字.您应该使用运算符 ['+ ...

  3. C++ 24点游戏算法

    原题链接:24点游戏算法_牛客题霸_牛客网 描述 给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个 ...

  4. C#:实现24点游戏算法(附完整源码)

    C#:实现24点游戏算法 using System; using System.Collections; using System.Collections.Generic; using System. ...

  5. 华为oj题目c语言,华为OJ机试题目——24点游戏算法

    对于这种题用程序实现只能是穷举的思想,而做法各异,如下代码是利用符号的不断变化,利用4个数计算值,默认是4个数字a,b,c,d是按顺序计算的,即默认是加了括号的,即(((a op1 b)op2 c)o ...

  6. 华为机试HJ67:24点游戏算法

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 输入: 4个 ...

  7. 【华为机试067】24点游戏算法

    题目描述: 给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 输入: 4个1-10的数字.[数字允许重复,但每个数字仅允许使用一次,测试用例保证无异常数字] 输出: true or fal ...

  8. 匈牙利算法编程c语言,华为oj之素数伴侣---匈牙利算法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述 若两个正整数的和为素数,则这两个正整数称之为"素数伴侣",如2和5.6和13,它们能应用于通信加密.现在密码学会请你 ...

  9. 【python】24点游戏算法

    从 1-13 中随机抽出 4 张牌(不允许重复),任意填入运算符"+ .- .\* ./"(分别表示加.减.乘.除),使得计算的结果为 24. 代码: import random ...

  10. 【华为机考题库学习】--算法篇(更新中……)

    系列文章目录 文章目录 系列文章目录 前言 一.HJ1 字符串最后一个单词的长度 二.HJ2 计算某字符出现的次数 三.HJ3 明明的随机数 四.HJ4 字符串分隔 五.HJ5 进制转换 六.HJ6 ...

最新文章

  1. tomcat日志切割-logrotate
  2. 计算机应用专业毕业设计总结,6.1-7(3)2005年计算机应用技术专业毕业生毕业设计和毕业答辩工作总结0207-ZH...
  3. CodeForces - 504B Misha and Permutations Summation(线段树模拟康托展开与逆展开)
  4. 【Oracle Database】数据库控制文件管理
  5. 人气TOP|当红炸子鸡「小明机器人」,出道走花路啦
  6. 简记用ArcGIS处理某项目需求中数据的步骤
  7. Red Hat 6.0 Installation Steps
  8. Android之自定义控件深入
  9. jq mysql二级联动_jq+php+mysql 实现二级菜单联动
  10. 数据科学的原理与技巧 一、数据科学的生命周期
  11. 苹果涉嫌利用App Store打压屏幕时间应用竞争对手 已被投诉至欧盟
  12. java工程中的相关路径
  13. win7系统如何添加打印机服务器,win7系统中添加打印服务器端口的方法 。 win7系统如何添加服务器打印机端口。...
  14. Glide 的 transformation
  15. java上传微博图床_php上传图片到微博图床
  16. 关于Linux服务器中文字体的安装
  17. 502问题怎么排查?
  18. Python爬取图片并保存本地
  19. [读书笔记—程序员]《高效程序员的45个习惯:敏捷开发修炼之道》- 苏帕拉马尼亚姆,亨特
  20. 法院HP EVA8400删除VDISK后数据恢复

热门文章

  1. 图表的绘制(使用Dundas组件)
  2. Flink最全面教程(自己总结的)
  3. 小学数学计算机教案模板,小学数学教案模板5篇
  4. 比较好的Android社区
  5. python 打开dat格式_p4vasp分析态密度输出pdos数据后用Python分列
  6. php dht,dht.php
  7. 办公OA系统毕业设计论文
  8. CentOS 5.3启动后报错——ata1.00: error
  9. ADSL上网密码破解记
  10. 按键精灵之自动复制粘贴到Excel单元格中