【华为OJ】【097-24点游戏算法】
【华为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点游戏算法】相关推荐
- [华为机试练习题]44.24点游戏算法
题目 注意: 6 + 2 * 4 + 10 = 24 不是一个数字一个数字的计算 代码 /*--------------------------------------- * 日期:2015-07-0 ...
- ACM. HJ67 24点游戏算法 679. 24 点游戏
HJ67 24点游戏算法 ●● 679. 24点游戏 ●●● 描述 给定一个长度为4的整数数组 cards .你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字.您应该使用运算符 ['+ ...
- C++ 24点游戏算法
原题链接:24点游戏算法_牛客题霸_牛客网 描述 给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个 ...
- C#:实现24点游戏算法(附完整源码)
C#:实现24点游戏算法 using System; using System.Collections; using System.Collections.Generic; using System. ...
- 华为oj题目c语言,华为OJ机试题目——24点游戏算法
对于这种题用程序实现只能是穷举的思想,而做法各异,如下代码是利用符号的不断变化,利用4个数计算值,默认是4个数字a,b,c,d是按顺序计算的,即默认是加了括号的,即(((a op1 b)op2 c)o ...
- 华为机试HJ67:24点游戏算法
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 输入: 4个 ...
- 【华为机试067】24点游戏算法
题目描述: 给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 输入: 4个1-10的数字.[数字允许重复,但每个数字仅允许使用一次,测试用例保证无异常数字] 输出: true or fal ...
- 匈牙利算法编程c语言,华为oj之素数伴侣---匈牙利算法
版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述 若两个正整数的和为素数,则这两个正整数称之为"素数伴侣",如2和5.6和13,它们能应用于通信加密.现在密码学会请你 ...
- 【python】24点游戏算法
从 1-13 中随机抽出 4 张牌(不允许重复),任意填入运算符"+ .- .\* ./"(分别表示加.减.乘.除),使得计算的结果为 24. 代码: import random ...
- 【华为机考题库学习】--算法篇(更新中……)
系列文章目录 文章目录 系列文章目录 前言 一.HJ1 字符串最后一个单词的长度 二.HJ2 计算某字符出现的次数 三.HJ3 明明的随机数 四.HJ4 字符串分隔 五.HJ5 进制转换 六.HJ6 ...
最新文章
- tomcat日志切割-logrotate
- 计算机应用专业毕业设计总结,6.1-7(3)2005年计算机应用技术专业毕业生毕业设计和毕业答辩工作总结0207-ZH...
- CodeForces - 504B Misha and Permutations Summation(线段树模拟康托展开与逆展开)
- 【Oracle Database】数据库控制文件管理
- 人气TOP|当红炸子鸡「小明机器人」,出道走花路啦
- 简记用ArcGIS处理某项目需求中数据的步骤
- Red Hat 6.0 Installation Steps
- Android之自定义控件深入
- jq mysql二级联动_jq+php+mysql 实现二级菜单联动
- 数据科学的原理与技巧 一、数据科学的生命周期
- 苹果涉嫌利用App Store打压屏幕时间应用竞争对手 已被投诉至欧盟
- java工程中的相关路径
- win7系统如何添加打印机服务器,win7系统中添加打印服务器端口的方法 。 win7系统如何添加服务器打印机端口。...
- Glide 的 transformation
- java上传微博图床_php上传图片到微博图床
- 关于Linux服务器中文字体的安装
- 502问题怎么排查?
- Python爬取图片并保存本地
- [读书笔记—程序员]《高效程序员的45个习惯:敏捷开发修炼之道》- 苏帕拉马尼亚姆,亨特
- 法院HP EVA8400删除VDISK后数据恢复