[华为oj]24点问题

这里提供自己解二十四点的思路。总的思路就是用类似递归思想:

(1)在4个数中选两个数进行运算,与另外两个数放在一起,执行步骤(2);

   判断步骤(2)返回结果,为1,返回结果1;为0,继续下一个运算,直至结束,返回结果0;

(2)在3个数中选两个数进行运算,与另一个数放在一起,执行步骤(3);

  判断步骤(3)返回结果,为1,返回结果1;为0,继续下一个运算,直至结束,返回结果0;

(3)对两个数进行运算,判断是否为24。是,返回1;否,返回0。

这个思想就是穷举方法,列出所有可能的情况,有个好处就是不需要考虑括号的情况。代码比较多,但应该比较好理解一点。两个细节:

1)在两个数进行运算的时候,需要把先后顺序也考虑进去。

2)当除数为0时,显然不满足情况,因此,返回一个比较大的值。

具体代码如下:

  1 #include <iostream>
  2
  3 using namespace std;
  4
  5 char op[4]={‘+‘,‘-‘,‘*‘,‘/‘};
  6
  7 float CalNum(float a,float b,char op)
  8 {
  9     if(b==0)
 10         return 10000;
 11
 12     float t=0;
 13     switch(op)
 14     {
 15         case ‘+‘:
 16             t=a+b;
 17             break;
 18         case ‘-‘:
 19             t=a-b;
 20             break;
 21         case ‘*‘:
 22             t=a*b;
 23             break;
 24         case ‘/‘:
 25             t=a/b;
 26             break;
 27     }
 28     return t;
 29 }
 30
 31 float Cal2Num(float a[])
 32 {
 33     float result=0;
 34     for(int i=0;i<2;i++)
 35     {
 36         for(int p=0;p<4;p++)
 37         {
 38             result=CalNum(a[i],a[1-i],op[p]);
 39             if(result==24)
 40             {
 41                 return 1;
 42             }
 43         }
 44     }
 45     return 0;
 46 }
 47
 48 float Cal3Num(float a[])
 49 {
 50     float a2[2];
 51     for(int i3=0;i3<3;i3++)
 52     {
 53         for(int j3=i3+1;j3<3;j3++)
 54         {
 55             for(int k=0;k<3;k++)
 56             {
 57                 if(k!=i3&&k!=j3)
 58                     a2[1]=a[k];
 59             }
 60
 61             for(int p=0;p<4;p++)
 62             {
 63                 for(int d=0;d<2;d++)
 64                 {
 65                     if(d==0)
 66                         a2[0]=CalNum(a[i3],a[j3],op[p]);
 67                     else
 68                         a2[0]=CalNum(a[j3],a[i3],op[p]);
 69                     if(Cal2Num(a2))
 70                         return 1;
 71                 }
 72             }
 73         }
 74     }
 75     return 0;
 76 }
 77
 78 float Cal4Num(float a[])
 79 {
 80     float a3[3];
 81     for(int i=0;i<4;i++)
 82     {
 83         for(int j=i+1;j<4;j++)
 84         {
 85             int t=1;
 86             for(int m=0;m<4;m++)
 87             {
 88                 if(m!=i&&m!=j)
 89                     a3[t++]=a[m];
 90             }
 91
 92             for(int p=0;p<4;p++)
 93             {
 94                 for(int d=0;d<2;d++)
 95                 {
 96                     if(d==0)
 97                         a3[0]=CalNum(a[i],a[j],op[p]);
 98                     else
 99                         a3[0]=CalNum(a[j],a[i],op[p]);
100                     if(Cal3Num(a3))
101                         return 1;
102                 }
103             }
104         }
105     }
106     return 0;
107 }
108
109 int main()
110 {
111     float a4[4];
112     cin>>a4[0]>>a4[1]>>a4[2]>>a4[3];
113     if(Cal4Num(a4))
114         cout<<"true"<<endl;
115     else
116         cout<<"false"<<endl;
117     return 0;
118 }
时间: 2024-08-02 06:03:52

[华为oj]24点问题的相关文章

【华为OJ】【075-判断两个IP是否属于同一子网】

[华为OJ][算法总篇章] [华为OJ][075-判断两个IP是否属于同一子网] [工程下载] 题目描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据. 子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为"1"和主机号部分全为"0".利用子网掩码可以判断 两台主机是否中同一子网中.若两台主机的IP地址分别与它们的子网掩码相"与"后的结果相同,则说明这两台主机在同一子网中. 示例: IP地址 192.168.0.

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

华为OJ:汽水瓶

题目有点像小学数学题,因为三个空瓶可以换一瓶汽水,但喝完一瓶汽水就可以得到一个空瓶.所以相当于两个空瓶就可以换到一瓶汽水. 把输入除以2即可.这里讲一下java多出入,可以用in.hasNext(),就相当于C/C++里面的while(scanf("%d",n)!=EOF). import java.util.Scanner; public class qishuiping { public static void main(String args[]){ Scanner input=

华为OJ:分段排序

题目有点绕,一个是要二分,用三个字符串,存前,中,后三个,前,后部分都降序排序,然后后半部分再反转一下,讲三部分合起来就好了. import java.util.Scanner; public class dividesort { public static void sort(StringBuffer s){ for(int i=0;i<s.length();i++){ for(int j=i;j<s.length();j++){ if(s.charAt(i)>s.charAt(j))

华为OJ:2290 字符串最后一个单词的长度

用JAVA就很简单,只要用spilt函数,再输出最后一个字符串. 题意是要求你先自己写分隔好字符串这样子.有个比较坑的地方就是测试用例应该有个全为空的,要注意. import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); String ss[]=s.spli

华为OJ: 公共字串计算

有几个需要注意的地方,一个这道题是不区分大小写的,所以在计算之前对输入的字符串要做小写或者大写的转换. 第二个,思路一定要清晰,先将s1从[i]处开始与s2的[j]开始匹配,不相等则j++直到j等于s2.length()-1,相等,则i++,j++.注意,这里就是i++,即下次重新开始从s[i]开始匹配时,两次i之间的距离可能会超过1.再j那里设置一个计数器计数即可. import java.util.Scanner; public class findMaxSubStringLength {

【华为OJ】【044-超长正整数相加】

[华为OJ][算法总篇章] [华为OJ][044-超长正整数相加] [工程下载] 题目描述 请设计一个算法完成两个超长正整数的加法. 接口说明 /** * 请设计一个算法完成两个超长正整数的加法. * 输入参数: * String addend:加数 * String augend:被加数 * 返回值:加法结果 */ public String addLongInteger(String addend, String augend) { /*在这里实现功能*/ return null; } 输入

【华为OJ】【094-多线程】

[华为OJ][算法总篇章] [华为OJ][094-多线程] [工程下载] 题目描述 问题描述:有4个线程和1个公共的字符数组.线程1的功能就是向数组输出A,线程2的功能就是向字符输出B, 线程3的功能就是向数组输出C,线程4的功能就是向数组输出D.要求按顺序向数组赋值ABCDABCDABCD, ABCD的个数由线程函数1的参数指定. 输入描述: 输入一个int整数 输出描述: 输出多个ABCD 输入例子: 10 输出例子: ABCDABCDABCDABCDABCDABCDABCDABCDABCD

【华为OJ】【092-学英语】

[华为OJ][算法总篇章] [华为OJ][092-学英语] [工程下载] 题目描述 Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文: 如22:twenty two,123:one hundred and twenty three. 说明 数字为正整数,长度不超过十位,不考虑小数,转化结果为英文小写: 输出格式为twenty two: 非法数据请返回"error": 关键字提示:and,billion,million,thousand,hundred. 方法原型:pu