zoukankan      html  css  js  c++  java
  • 1.16 24点游戏

    问题:
        给玩家4张牌,每张牌的面值在1-13之间,允许其中有数值相同的牌,采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能用一次。构造表达式,使其结果为24。
     
    解题思路:穷举、回溯。设数字集合为A,每次从A中任取出2个数,穷举进行4种运算(+,-,*,/),将运算结果放入A中,直到最后A中剩下一个数。
    用覆盖的方法来剔除取出的2个数,值得学习!!
     
    参考书中的代码:
     
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    
    using namespace std;
    
    const double bound=1e-6; //浮点数运算存在误差 
    string str[5];
    double num[5];
    
    int f(int n)
    {
        if(n==1)
        {
            if(fabs(num[1]-24)<bound)
            {
                cout<<str[1]<<endl;
                return 1;
            }
            else
                return 0;                        
        }        
        
        for(int i=1;i<n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                double a=num[i];
                double b=num[j];
                string t1,t2;
                t1=str[i];
                t2=str[j];
                //覆盖掉用过的数 
                num[j]=num[n];
                str[j]=str[n];
                
                num[i]=a+b;
                str[i]='('+t1+'+'+t2+')';
                if(f(n-1))
                    return 1;
                
                num[i]=a*b;
                str[i]='('+t1+'*'+t2+')';
                if(f(n-1))
                    return 1;
                    
                num[i]=a-b;
                str[i]='('+t1+'-'+t2+')';
                if(f(n-1))
                    return 1;       
    
                num[i]=b-a;
                str[i]='('+t2+'-'+t1+')'; 
                if(f(n-1))
                    return 1;   
                
                if(b!=0)
                {
                    num[i]=a/b;
                    str[i]='('+t1+'/'+t2+')';    
                    if(f(n-1))
                        return 1;    
                }            
                
                if(a!=0)
                {
                    num[i]=b/a;
                    str[i]='('+t2+'/'+t1+')'; 
                    if(f(n-1))
                        return 1;       
                }
                
                num[i]=a;
                num[j]=b;
                str[i]=t1;
                str[j]=t2;
            }        
        }
        return 0;
    }
    
    int main()
    {
        for(int i=1;i<=4;i++)
        {
            cin>>num[i];
            //itoa函数只能用 char[]做参数 
            char buf[30];        
            itoa(num[i],buf,10);
            str[i]=buf;
        }        
        f(4);
        system("pause");
        return 0;
    }
    View Code
  • 相关阅读:
    yii2时区语言设置
    yii2 gii开启
    yii components文件到底应该放些什么代码
    nginx配置 yii2 URL重写规则 SSI配置使shtml
    layuiAdmin pro v1.x 【单页版】开发者文档
    layuiAdmin std v1.x 【iframe版】开发者文档
    Layui自定义模块的使用方式
    第九十三节 简化表单错误信息提取
    第九十二节 自定义验证字段的方法
    CSS盒子模型
  • 原文地址:https://www.cnblogs.com/icfnight/p/3245561.html
Copyright © 2011-2022 走看看