编程之美:24点游戏

一、问题描述

给玩家4张牌,每张牌牌面值在1~13之间,允许其中有数值相同的牌。采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能使用一次,尝试构造一种表达式,使其运算结果为24.

输入:3 3 7 7

输出:(((3)/(7))+(3))*(7)

二、程序实现原理

遍历所有可能的组合,直到找到一个符合条件的组合或者遍历所有情况没有找到满足的组合,具体详见代码注释

三、程序基本实现

#include<iostream>
#include<string>
#include<cstdio>
#define threshold 1E-6
#define num_count 4
#define resultv 24

using namespace std;
double number[num_count];
//表达式结果暂存表
string result[num_count];
bool pointGame(int n){
    //
    if(n==1){
        //由于浮点数运算不能直接比较大小,因此采用阈值限制判断相等
        if(abs(number[0]-resultv)<threshold){
            cout<<result[0]<<endl;
            return true;
        }else{
            return false;
        }

    }
    //对n(n>2)个元素,随机取两个元素,双重循环,取得所有两两组合
	//更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            double a,b;
            a=number[i];
            b=number[j];
            string expa,expb;
            expa=result[i];
            expb=result[j];
            /*当进行i,j位置两个元素的四则运算后,程序的规模有n变成了n-1(i,j两个元素合并成了一个元素)
            * 这n-1个元素包括去除i,j位置的值,在加上i,j计算的结果值
            * 如何将这n-1个元素保存在前n-1个位置,以递归调用pointGame方法。
            * 将最后位置(n-1)的元素,保存在j位置,将i,j之和保存在i位置。
            */
            number[j]=number[n-1];
            result[j]=result[n-1];
            //+运算
            number[i]=a+b;
            result[i]="("+expa+")"+"+"+"("+expb+")";
            if(pointGame(n-1)){
                return true;
            }
            //-运算
            number[i]=a-b;
            result[i]="("+expa+")"+"-"+"("+expb+")";
            if(pointGame(n-1)){
                return true;
            }
            number[i]=b-a;
            result[i]="("+expb+")"+"-"+"("+expa+")";
            if(pointGame(n-1)){
                return true;
            }
            // *运算
            number[i]=a*b;
            result[i]="("+expa+")"+"*"+"("+expb+")";
            if(pointGame(n-1)){
                return true;
            }
            // /运算
            number[i]=a/b;
            result[i]="("+expa+")"+"/"+"("+expb+")";
            if(pointGame(n-1)){
                return true;
            }
            number[i]=b/a;
            result[i]="("+expb+")"+"/"+"("+expa+")";
            if(pointGame(n-1)){
                return true;
            }
            number[i]=a;
            number[j]=b;
            result[i]=expa;
            result[j]=expb;
        }
    }
    return false;
}
int main(){
    cout<<"please input four numbers:"<<endl;
    int a;
    for(int i=0;i<num_count;i++){
        char ch[20];
        cin>>a;
        number[i]=a;
        sprintf(ch,"%d",a);
        result[i]=ch;
    }
    if(pointGame(4)){
        cout<<"成功"<<endl;
    }else{
        cout<<"失败"<<endl;
    }
    system("pause");
    return 0;
}

高效方法待续。。。。。。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索游戏编程
, include
, 表达式
, define
, 组合
, 编程之美
, 运算
, 四则运算
24点
,以便于您获取更多的相关知识。

时间: 2024-12-30 23:28:39

编程之美:24点游戏的相关文章

编程之美:找到符合条件的整数

一.问题描述 任意给定一个正整数N,求一个最小正整数M(M>1),使得N*M的十进制形式只含1和0. 比如 N=99,M=1 122 334 455 667 789 ,N*M=111 111 111 111 111 111; M就是当N=99时,符合条件的数 二.解题思路 考虑将问题转化为:找只含有0和1的能被N整除的最小正整数.可以看出这是和原问题等价的. 那么需要将0和1组成的所有数从小到大遍历吗? 这样的话,如果寻找的数是k位,则需要搜索2k-1个数才能得到结果. 这里采用的方式是在计算中

编程之美:1的数目

一.问题描述 给定一个十进制数N,写下从1开始,到N的所有整数,然后数一下之中所有"1"的个数. 例如: N=12,(1,2,3,4,5,6,7,8,9,10,11,12)共有5个1 二.解题思想 假设N=abcde为一个整数,a,b,c,d,e分别对应十进制数,如果要计算(1到N)百位出现1的个数,他将受三个因素的影响:百位以上的数,百位数和百位一下的数,具体依赖如下: 分别设整数N百位以上,百位和百位一下的数字分别为:preNum,curNum,proNum,如N=abcde的三个

编程之美:小飞的电梯调度算法

一.问题描述 亚洲微软研究院所在的希格玛大厦一共有6部电梯.在高峰时间,每层都有人上下,电梯每层都停.实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层.所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层.在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层. 问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?

编程之美:平面最近点对

一.概念引入         最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.严格地说,最接近点对可能多于1对.为了简单起见,这里只限于找其中的一对.         最简单的就是直接暴力,也可以分治,使用分治的话关键是如何合并,如果两边都是n/2个点比较的话,合并的时间是O(n^2),那么T(n)=2T(n/2)+O(n2),它的解为T(n)=O(n2),还是没什么优势,这就引导我们去优化合并算法.         为了找到一个有效的合并算

盖茨扎克伯格现身说法:讲述编程之酷

新浪科技讯 北京时间3月2日上午消息,美国公益组织Code.org的一段最新视频请来了马克·扎克伯格(Mark Zuckerberg)和比尔·盖茨(Bill Gates)等业界大佬现身说法,讲述编程之酷.视频:盖茨扎克伯格等讲述编程之酷 媒体来源:新浪科技这段视频不仅展示了Facebook的前卫工作环境,还邀请了迈阿密热火队的克里斯·波什(Chris Bosh)和黑眼豆豆首脑人物Will.i.am讲述编程之美:程序员已经不再是西装革履的码农,他们可以穿着套头衫在Facebook园区内东奔西跑,而

Python中线程编程之threading模块的使用详解

  这篇文章主要介绍了Python中线程编程之threading模块的使用详解,由于GIL的存在,线程一直是Python编程中的焦点问题,需要的朋友可以参考下 threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入.下面分别举例说明.先来看看通过继承th

Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)_Android

本文实例讲述了Android编程之canvas绘制各种图形的方法.分享给大家供大家参考,具体如下: 1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into

Android编程之SurfaceView学习示例详解_Android

本文实例讲述了Android编程之SurfaceView学习示例.分享给大家供大家参考,具体如下: SurfaceView是View的子类,使用的方式与任何View所派生的类都是完全相同的,可以像其他View那样应用动画,并把它们放到布局中. SurfaceView封装的Surface支持使用本章前面所描述的所有标准Canvas方法进行绘图,同时也支持完全的OpenGL ES库. 使用OpenGL,你可以再Surface上绘制任何支持的2D或者3D对象,与在2D画布上模拟相同的效果相比,这种方法

Android编程之MD5加密算法实例分析_Android

本文实例分析了Android编程之MD5加密算法.分享给大家供大家参考,具体如下: Android MD5加密算与J2SE平台一模一样,因为Android 平台支持 java.security.MessageDigest这个包.实际上与J2SE平台一模一样. 算法签名: 复制代码 代码如下: String getMD5(String val) throws NoSuchAlgorithmException 输入一个String(需要加密的文本),得到一个加密输出String(加密后的文本) pa