华为机试HJ67:24点游戏算法
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
输入:
4个1-10的数字。[数字允许重复,但每个数字仅允许使用一次,测试用例保证无异常数字。
输出:
true or false
本题含有多组样例输入。
输入描述:
输入4个int整数
输出描述:
返回能否得到24点,能输出true,不能输出false
示例:
输入:
7 2 1 10
输出:
true
解题思路:
本题是深度优先遍历dfs的经典题目:输入4个1-10的数字,用加减乘除使其结果为24。用dfs函数进行递归遍历求解,当计算到第四步时,step为3,此时判断是否为24,若有结果则令flag为true;声明num数组存放数字,声明visit数组存放当前数字是否可用。
假设输入数字为7654,则第一个遍历为7+6+5+4,再7+6+5-4。。。再7+6-5+4。。。。再7+6+4+5。。。以此类推。另外,dfs扔进去的和是前面的所有值计算完的结果再操作后面的值,换句话说,7+6+5*4,它扔进去的是(7+6+5)*4,虽然此时计算的结果和预想的不一样,别忘了还有排序,后面会有5*4+7+6的计算表达式,这样就确保了该计算的表达式依然会进行计算。
注意:因为sum初始为0,所以要考虑一下不同情况,不然会出现0*X=0。
测试代码:
#include <iostream>using namespace std;double num[4];
bool flag=false;
bool visit[4]={0};void dfs(int step,double sum)
{if(flag)return;if(step==3){if(sum==24.){flag=true;return;}}else{step++;for(int i=0;i<4;++i){if(!visit[i]){visit[i]=true;dfs(step,sum+num[i]);dfs(step,sum-num[i]);if(step!=0){dfs(step,sum*num[i]);dfs(step,sum/num[i]);}visit[i]=false;if(flag)return;}}}}int main()
{while(cin>>num[0]>>num[1]>>num[2]>>num[3]){dfs(-1,0);if(flag){cout<<"true"<<endl;}else{cout<<"false"<<endl;}flag=false;num[4]={0};visit[4]={0};}return 0;
}
后来测试我发现,1 9 1 2这个例子过不了,但是(9-1)*(2+1)=24,这是因为上面的算法考虑括号操作不周全导致的,牛客一名大佬“ultraji” 所提供的的算法思路更完善些,在此分享给大家。
其逻辑是:借用next_permutation函数排布4个数字的顺序,往里面塞入3个运算符,再用for循环处理各种可能的括号情况。其代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;double op(double a, double b, int opera)
{if(opera == 0) return a+b;else if(opera == 1) return a-b;else if(opera == 2) return a*b;else if(opera == 3) return a/b;return 0;
}bool cal24(vector<double> a, vector<int> o)
{// 考虑括号导致优先级变化bool flag = false;if(o.empty()) {if( fabs(a[0]-24.0) < 0.01) flag = true;} else {for (int i = 0; i < o.size() && !flag; i++){a[i] = op(a[i], a[i+1], o[i]);a.erase(a.begin()+i+1);o.erase(o.begin()+i);flag |= cal24(a, o);}}return flag;
}int main()
{double a[4];int o[3];while(cin >> a[0] >> a[1] >> a[2] >> a[3]){bool flag = false;sort(a, a+4);do {for(int i = 0; i < 4 && !flag; i++) {o[0] = i;for(int j = 0; j < 4 && !flag; j++) {o[1] = j; for(int k = 0; k < 4 && !flag; k++) {o[2] = k;vector<double> va(a, a+4);vector<int> vo(o, o+3);if(cal24(va, vo)) flag = true;}}}} while (next_permutation(a, a+4) && !flag);if( flag ) cout << "true" << endl;else cout << "false" << endl;}return 0;
}
华为机试HJ67:24点游戏算法相关推荐
- 华为oj题目c语言,华为OJ机试题目——24点游戏算法
对于这种题用程序实现只能是穷举的思想,而做法各异,如下代码是利用符号的不断变化,利用4个数计算值,默认是4个数字a,b,c,d是按顺序计算的,即默认是加了括号的,即(((a op1 b)op2 c)o ...
- ACM. HJ67 24点游戏算法 679. 24 点游戏
HJ67 24点游戏算法 ●● 679. 24点游戏 ●●● 描述 给定一个长度为4的整数数组 cards .你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字.您应该使用运算符 ['+ ...
- 华为机试 素数伴侣 匹配匈牙利算法
题目描述 题目描述 若两个正整数的和为素数,则这两个正整数称之为"素数伴侣",如2和5.6和13,它们能应用于通信加密.现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数 ...
- 华为机试---Word Maze迷宫游戏
import java.util.Scanner; public class Main{ private static boolean isFind = false;//全局变量,保存是否找到食物单词 ...
- 牛客在线编程-华为机试-中等
牛客在线编程题目-华为机试-中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21.21% HJ17 坐标移动 字符串 中等 24.79% HJ20 密码验证合格程序 数组 字 ...
- 华为机试108题(C 语言解答)
Nowcoder题库链接:华为机试 HJ1 字符串最后一个单词的长度(字符串) 输入:hello nowcoder输出:8说明: 最后一个单词为nowcoder,长度为8 示例代码: HJ1.c #i ...
- 【华为机试 Python实现】华为机试题集合(已更新171篇)
文章目录 新手指引 数据结构基础 华为机试真题系列 牛客网华为机试系列 Python 八股文系列 <华为机试真题详解>专栏定价99.9 包含 <华为机试真题>的所有题目. 包含 ...
- 【HUAWEI】华为机试试题-105
LeeCode试题链接直接上 HJ1 字符串最后一个单词的长度 HJ2 计算某字符出现次数 HJ3 明明的随机数:随机数去重排序输出(小-大) HJ4 字符串分隔:输入一个字符串,请按长度为8拆分每个 ...
- [华为机试练习题]44.24点游戏算法
题目 注意: 6 + 2 * 4 + 10 = 24 不是一个数字一个数字的计算 代码 /*--------------------------------------- * 日期:2015-07-0 ...
最新文章
- 一、ExtMail Solution概述--EXTMAIL
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...
- Ubuntu composer安装失败解决方案
- makefile使用宏及用法$(宏标识符) $(cc)_宏编程的艺术
- kaggle机器学习 入门
- element ui登录界面_Vue和Element-UI做一个简单的登录页面
- java.net.UnknownHostException: dbmtimehadoop
- oracle11gasm,Oracle11gASM之ACFS创建案例
- 模糊搜索神器FZF番外篇
- 降价到心痛也无人问津!这款手机成绝唱...
- 利用Xposed+JustTrustMe绕过Android App(途牛apk)的SSL Pinning
- Typora配置阿里云图床详细教程(PicGo+阿里云OSS)
- HTTP基础知识你知道吗?
- base64图片上传解析不了问题
- 计算机机械硬盘寿命,有问有答:电脑的机械硬盘和固态硬盘哪个寿命更长?
- 为什么在wps中调整了0.5倍行距,某一页的行数不会发生变化?
- DeepFlow Large displacement optical flow with deep matching
- 利用background-position 制作图片爆炸的效果
- FPGA_Verilog学习之旅(3)---VGA贪吃蛇游戏
- 如何提高自己的编码水平
热门文章
- Node.js 线程你理解的可能是错的 1
- 3-4-多数组中位数
- 你需要的是持续的服务改进 1
- Linux下的dhcp测试实现方法
- 5-6 AOF15-7 AOF25-8 AOF实验
- mysql如何输出一句话_MySQL/ACCESS导出一句话拿WebShell后门命令
- python 网络编程模块_Python网络编程之socket模块
- 和quicklook相似的软件_细数软件推荐上万热度出现比例较高的10款软件,看看谁出现最多...
- 二叉树和等于某值路径_Go刷LeetCode系列:二叉树(3)二叉树路径和
- 西南科技大学计算机专业宿舍条件怎么样,西南科技大学宿舍条件,宿舍环境图片(10篇)...