作者:翟天保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点游戏算法相关推荐

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

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

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

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

  3. 华为机试 素数伴侣 匹配匈牙利算法

    题目描述 题目描述 若两个正整数的和为素数,则这两个正整数称之为"素数伴侣",如2和5.6和13,它们能应用于通信加密.现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数 ...

  4. 华为机试---Word Maze迷宫游戏

    import java.util.Scanner; public class Main{ private static boolean isFind = false;//全局变量,保存是否找到食物单词 ...

  5. 牛客在线编程-华为机试-中等

    牛客在线编程题目-华为机试-中等 题号 题目 知识点 难度 通过率 HJ16 购物单 动态规划 中等 21.21% HJ17 坐标移动 字符串 中等 24.79% HJ20 密码验证合格程序 数组 字 ...

  6. 华为机试108题(C 语言解答)

    Nowcoder题库链接:华为机试 HJ1 字符串最后一个单词的长度(字符串) 输入:hello nowcoder输出:8说明: 最后一个单词为nowcoder,长度为8 示例代码: HJ1.c #i ...

  7. 【华为机试 Python实现】华为机试题集合(已更新171篇)

    文章目录 新手指引 数据结构基础 华为机试真题系列 牛客网华为机试系列 Python 八股文系列 <华为机试真题详解>专栏定价99.9 包含 <华为机试真题>的所有题目. 包含 ...

  8. 【HUAWEI】华为机试试题-105

    LeeCode试题链接直接上 HJ1 字符串最后一个单词的长度 HJ2 计算某字符出现次数 HJ3 明明的随机数:随机数去重排序输出(小-大) HJ4 字符串分隔:输入一个字符串,请按长度为8拆分每个 ...

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

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

最新文章

  1. 一、ExtMail Solution概述--EXTMAIL
  2. getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...
  3. Ubuntu composer安装失败解决方案
  4. makefile使用宏及用法$(宏标识符) $(cc)_宏编程的艺术
  5. kaggle机器学习 入门
  6. element ui登录界面_Vue和Element-UI做一个简单的登录页面
  7. java.net.UnknownHostException: dbmtimehadoop
  8. oracle11gasm,Oracle11gASM之ACFS创建案例
  9. 模糊搜索神器FZF番外篇
  10. 降价到心痛也无人问津!这款手机成绝唱...
  11. 利用Xposed+JustTrustMe绕过Android App(途牛apk)的SSL Pinning
  12. Typora配置阿里云图床详细教程(PicGo+阿里云OSS)
  13. HTTP基础知识你知道吗?
  14. base64图片上传解析不了问题
  15. 计算机机械硬盘寿命,有问有答:电脑的机械硬盘和固态硬盘哪个寿命更长?
  16. 为什么在wps中调整了0.5倍行距,某一页的行数不会发生变化?
  17. DeepFlow Large displacement optical flow with deep matching
  18. 利用background-position 制作图片爆炸的效果
  19. FPGA_Verilog学习之旅(3)---VGA贪吃蛇游戏
  20. 如何提高自己的编码水平

热门文章

  1. Node.js 线程你理解的可能是错的 1
  2. 3-4-多数组中位数
  3. 你需要的是持续的服务改进 1
  4. Linux下的dhcp测试实现方法
  5. 5-6 AOF15-7 AOF25-8 AOF实验
  6. mysql如何输出一句话_MySQL/ACCESS导出一句话拿WebShell后门命令
  7. python 网络编程模块_Python网络编程之socket模块
  8. 和quicklook相似的软件_细数软件推荐上万热度出现比例较高的10款软件,看看谁出现最多...
  9. 二叉树和等于某值路径_Go刷LeetCode系列:二叉树(3)二叉树路径和
  10. 西南科技大学计算机专业宿舍条件怎么样,西南科技大学宿舍条件,宿舍环境图片(10篇)...