24点游戏



#include<iostream>

 

#include<cstdlib>

 

#include<cmath>

 

#include<ctime> 

 

#include<string>

 

using namespace std;

 

int n=4;//三次运算标记值 

 

int A[4]={0};//存储4个数字

 

char oper[4]={'+','-','*','/'}; //存储运算符

 

string B[4];

 

int count=0;

 

int F(int n){

 

        //判断是否已完成三次运算 

 

        if(n==1){

 

                 if(A[0]==24)//判断结果是否为24 

 

                 {       

 

                         cout<<B[0]<<endl;//如果可以则输出,B[0]里蕴含了整个表达式 

 

                         count++;

 

                 }


 

                 else

 

                 {}


 

        }

 

        //从数组中任意取出两个数的组合 

 

        for(int
i=0;i<n;i++){

 

                 for(int
j=i+1;j<n;j++){

 

                         double
a,b;

 

                         string
x,y;

 

                         a=A[i];

 

                         b=A[j];

 

                         A[j]=A[n-1];//将最后一位的赋给空出来的j                

 

                         x=B[i];

 

                         y=B[j];

 

                         B[j]=B[n-1];//最后一位的数字放入第j个 

 

                         

 

                         A[i]=a+b;//第一个空间保存前两个的运算结果 

 

                         B[i]='('+x+'+'+y+')';//将第一步的运算结果存入数组 

 

                         F(n-1);

 

                         

 

                         //减法应该分顺序 

 

                         A[i]=a-b;

 

                         B[i]='('+x+'-'+y+')';

 

                         F(n-1);

 

                         A[i]=b-a;

 

                         B[i]='('+y+'-'+x+')';

 

                         F(n-1);

 

                         //乘法 

 

                         A[i]=a*b;

 

                         B[i]='('+x+'*'+y+')';

 

                         F(n-1);

 

                         //除法也要分顺序, 并且判断分母不为零 

 

                         if(b!=0){

 

                                  A[i]=a/b;

 

                                  B[i]='('+x+'/'+y+')';

 

                                  F(n-1);

 

                         }

 

                         if(a!=0){

 

                                  A[i]=b/a;

 

                                  B[i]='('+y+'/'+x+')';

 

                                  F(n-1);

 

                         }

 

                         //当以上四则运算的结果都不能满足条件时

 

                         //为了方便进入下一个for循环, 需要将之前的i和j上的值都重新找回 

 

                         A[i]=a;

 

                         A[j]=b;

 

                         B[i]=x;

 

                         B[j]=y;

 

                 

 

                 }

 

                 

 

        }

         return 0;

 

}

 

/*

 

*对于每一个类,都可以在构造函数中构建一次随机数种子。 

 

*这样,由于一个随机数种子会对应一个随机数。再由于时间在波动,所以,就可以更新随机数。 

 

*同样可以增加代码的重用。可以说是一个非常好的程序员思维。 

 

*/

 

class RandomNumber{

 

public:

 

   
RandomNumber(){

 

       
srand(time(0));

 

    }

 

   
int get(int begin = 0, int end = 1){

 

       
return rand()%(end-begin+1)+begin;

 

    }

 

}; 

 

int main(){

 

        RandomNumber
r;

 

   
for (int i = 0; i < 4; ++i) {//生成4个1~13之间的数字 

 

       
A[i]=r.get(1,13);

 

                 cout<<A[i]<<"
"; 

 

    }

 

   
cout<<endl;

 

        for(i=0;i<4;i++){

 

                 if(A[i]==1)
B[i]='A';

 

                 else
if(A[i]==11) B[i]='J';

 

                 else
if(A[i]==12) B[i]='Q';

 

                 else
if(A[i]==13) B[i]='K';

 

                 else
B[i]='0'+A[i];

 

        }


 

        F(n);

 

        cout<<endl<<"总共有 "<<count<<" 种解法"<<endl; 

 

        return
0;

 

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值