华为OJ机试题目——24点游戏算法

对于这种题用程序实现只能是穷举的思想,而做法各异,如下代码是利用符号的不断变化,利用4个数计算值,默认是4个数字a,b,c,d是按顺序计算的,即默认是加了括号的,即(((a op1 b)op2 c)op3 d)。而4个数字要组合顺序有A(4,4)=24种,很好理解,代码放在这里存档~

#include<iostream>
using namespace std;
/*
(((aop[i]b)op[j]c)op[k]d)
  */
static char op[]={'+','-','*','/'};
int cal(int a,int b,int c,int d,int i,int j,int k)
{
	int sum=0;
	if(i==0)sum=a+b;
	else if(i==1)sum=a-b;
	else if(i==2)sum=a*b;
	else if(i==3)sum=a/b;

	if(j==0)sum=sum+c;
	else if(j==1)sum-=c;
	else if(j==2)sum*=c;
	else if(j==3)sum/=c;

	if(k==0)sum+=d;
	else if(k==1)sum-=d;
	else if(k==2)sum*=d;
	else if(k==3)sum/=d;

	return sum;
}
bool Game24Points(int a, int b, int c, int d)
{
	int i,j,k;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			for(k=0;k<4;k++)
			{
				if(cal(a,b,c,d,i,j,k)==24) return true;
				if(cal(a,b,d,c,i,j,k)==24)return true;
				if(cal(a,c,b,d,i,j,k)==24)return true;
				if(cal(a,c,d,b,i,j,k)==24)return true;
				if(cal(a,d,b,c,i,j,k)==24)return true;
				if(cal(a,d,c,b,i,j,k)==24)return true;
				if(cal(b,a,c,d,i,j,k)==24)return true;
				if(cal(b,a,d,c,i,j,k)==24)return true;
				if(cal(b,c,a,d,i,j,k)==24)return true;
				if(cal(b,c,d,a,i,j,k)==24)return true;
				if(cal(b,d,a,c,i,j,k)==24)return true;
				if(cal(b,d,c,a,i,j,k)==24)return true;
				if(cal(c,a,b,d,i,j,k)==24)return true;
				if(cal(c,a,d,b,i,j,k)==24)return true;
				if(cal(c,b,a,d,i,j,k)==24)return true;
				if(cal(c,b,d,a,i,j,k)==24)return true;
				if(cal(c,d,a,b,i,j,k)==24)return true;
				if(cal(c,d,b,a,i,j,k)==24)return true;
				if(cal(d,a,b,c,i,j,k)==24)return true;
				if(cal(d,a,c,b,i,j,k)==24)return true;
				if(cal(d,b,a,c,i,j,k)==24)return true;
				if(cal(d,b,c,a,i,j,k)==24)return true;
				if(cal(d,c,a,b,i,j,k)==24)return true;
				if(cal(d,c,b,a,i,j,k)==24)return true;

			}
	return false;
}

int main()
{

		if(Game24Points(7, 2, 1, 10) == true) cout<<"true"<<endl;
		if(Game24Points(1, 2, 3, 4) == true)cout<<"true"<<endl;
		if(Game24Points(7, 7, 7, 7) == false)cout<<"true"<<endl;

	return 0;
}
时间: 2024-12-13 19:58:37

华为OJ机试题目——24点游戏算法的相关文章

2014年七月华为校招机试题目--最难的一道, 呵呵!

今天百无聊赖之时, 漫心看到14年的华为校招机试题目, 一共三道, 前两道皆是平平, 第三道却柳暗花明, 让人眼前一亮. 咋一看, 饶有趣味, 看似平淡无奇, 然而却玄机颇深(对我这种弱渣而言).(不过对于ACMer, 好像应该用基础算法, 就能解决!) (然而我也只会基础的算法!!忏愧的紧!!!).如果有幸被大神看到, 能指点我一两招, 不胜感激!  下面是题目和我的详细题解思路(可供巨巨一笑!嘿嘿!). 2014年七月华为校招机试题目: 第三题: 输入一个正整数X,在下面的等式左边的数字之间

华为2016机试题目01

牛客网做的华为2016机试题目,新手,代码较乱,一起讨论. 题目要求如下: 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一

华为OJ机试训练(一)

题目1 -- 通过输入英文句子.将每一个单词反过来,标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? 比如输入:Hello, I need an apple. 输出: /** * 华为机试训练1: 通过输入英文句子,将每一个单词反过来.标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? * Hello, I need an apple. * * @author snail * */ public class Mai

华为2016机试题目02

题目要求如下: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERR

华为2016机试题目03

题目描述如下: 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号. 处理: 1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加:(文件所在的目录不同,文件名和行号相同也要合并) 2.超过16个字符的文件名称,只记录文件的最后有效16个字符:(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并) 3.输入的文件可能带路径,记录文件名称不能带路径 输入描述: 一行或多行字符串.每行包括带路径文件名称,行号,以空格隔开.

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

题目 注意: 6 + 2 * 4 + 10 = 24 不是一个数字一个数字的计算 代码 /*--------------------------------------- * 日期:2015-07-03 * 作者:SJF0115 * 题目:24点游戏算法 * 来源:华为机试练习题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector&

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(

Hua Wei 机试题目

一.身份证号码验证 题目描述: 我国公民的身份证号码特点如下:1. 长度为18位:2. 第1-17位只能为数字:3. 第18位可以是数字或者小写英文字母x.4. 身份证号码的第7~14位表示持有人生日的年.月.日信息.例如:511 002 1988 08 08 0111或51100219880808011x.请实现身份证号码合法性判断的函数.除满足以上要求外,需要对持有人生日的年.月.日信息进行校验.年份大于等于1900年,小于等于2100年.需要考虑闰年.大小月的情况.所谓闰年,能被4整除且不

华为校招机试—传送门

华为机试-多个数的最大公约数 华为机试-算日期 华为机试-拼音翻译成阿拉伯数字(只有数字拼音) 华为机试-拼音翻译成阿拉伯数字(有Wan,Qian,Bai,Shi单位) 华为机试-输出大写字母 华为机试-亮着电灯的盏数(优化过的双重for) 华为机试-从考试成绩中划出及格线 华为机试-亮着电灯的盏数(1-N完全平方数的个数) 华为机试-大数相减 华为机试-姓名的夫妻相 华为机试-元素按奇偶排序 (金字塔) 华为机试-地铁换乘(图文吐血整理) 华为机试-"十七进制"转"十进制&