24点游戏

#include <iostream>  
#include <string>  
#include <cmath>  
   
using namespace std;  
   
const  double  PRECISION = 1E-6;  
const  int  COUNT_OF_NUMBER  = 4;  
const  int  NUMBER_TO_BE_CAL = 24;  
double  number[COUNT_OF_NUMBER];  
string  expression[COUNT_OF_NUMBER];  
bool Judgement = false;                    //判断是否有解。
int count = 0;   
   
void  Search(int   n)  
{  
      if (n   ==   1)
   {  
            if ( fabs(number[0] - NUMBER_TO_BE_CAL) <= PRECISION   )  //对于除法,要小心小数的精确位数
   {  
                  cout << expression[0] << "\t\t"; 
      Judgement = true;
      count ++;
      if((count % 3)==0)
       cout<<endl;
            }  
   else 
   {   }  
       }  
   
       for(int i=0;  i < n; i++)
    {
                for (int j = i + 1; j < n; j++)
    {  
                        double   a,   b;  
                        string   expa,   expb;  
   
                        a   =   number[i];  
                        b   =   number[j];  
                        number[j]  =  number[n - 1];   //递归之后,n比以前小一位,所以可以不停向前赋值 
   
                        expa   =   expression[i];  
                        expb   =   expression[j];  
                        expression[j]  =  expression[n - 1];   //递归之后,n比以前小一位,所以可以不停向前赋值
   
                        expression[i]   =   '('   +   expa   +   '+'   +   expb   +   ')';   //加法不需要分顺序
                        number[i]   =   a   +   b;  
                        Search(n-1);
                           
                        expression[i]   =   '('   +   expa   +   '-'   +   expb   +   ')';   //减法应该分顺序,减数以及被减数
                        number[i]   =   a   -   b;  
                        Search(n-1); 
                           
                        expression[i]   =   '('   +   expb   +   '-'   +   expa   +   ')';   //减法应该分顺序,减数以及被减数
                        number[i]   =   b   -   a;  
                        Search(n-1); 
                                                   
   
                        expression[i]   =   '('   +   expa   +   '*'   +   expb   +   ')';   //乘法不需要分顺序
                        number[i]   =   a   *   b;  
                        Search(n-1); 
   
                        if (b != 0)
      {  
                                expression[i]   =   '('   +   expa   +   '/'   +   expb   +   ')';   //除法应该分顺序,除数以及被除数
                                number[i] = a / b;  
                                Search(n-1);  
                        }    
                        if (a != 0)
      {  
                                expression[i]   =   '('   +   expb   +   '/'   +   expa   +   ')';   //除法应该分顺序,除数以及被除数
                                number[i]   =   b  /  a;  
                                Search(n-1);  
                        }  
   
                        number[i]   =   a;                  //这4句语句是为了防止如果上面几种可能都失败了的话,
                        number[j]   =   b;                  //就把原来的赋值撤消回去,以无干扰的正确的进入到下一次
                        expression[i]   =   expa;           //for循环队列中。
                        expression[j]   =   expb;           //
                }  
    }
}  
   
int  main()  
{  
  cout<<"请输入四张卡牌的数值:\n";
        for (int i = 0; i < COUNT_OF_NUMBER; i++) 
  {  
                char   buffer[20];   
    cout<<"The "<<i+1<<"th card:";
                cin   >>   number[i];                  
                itoa(number[i],   buffer,   10);   //itoa()函数的作用是把第一个参数(数值)传送到第二个参数(字符串)中去,第三个
               //参数(int型)是该数值在字符串里以什么进制存放。
                expression[i]   =   buffer;  
        }
 
  cout<<endl;
        Search(COUNT_OF_NUMBER) ;
  if(Judgement==true)
  {  
                cout   <<   "\n成功."   <<   endl;
    cout<<"运算的方法有"<<count<<endl;
        }  
  else
  {  
                  cout   <<   "失败."   <<   endl;  
        }       
  system("pause");
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言编写二十四点游戏(也称为24点游戏或四则运算游戏)是一个经典的编程练习,它主要利用数组和基本数学运算来解决。以下是简单的C语言程序框架,用于实现基本的二十四点算法: ```c #include <stdio.h> #include <stdlib.h> // 定义一个函数,用于计算给定数字数组能否得到24 int is_24(int *nums, int count) { for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { // 生成所有可能的两数组合 for (int k = j + 1; k < count; k++) { int a = nums[i], b = nums[j], c = nums[k]; // 用剩余的一个数尝试所有运算 for (int op = 0; op < 4; op++) { switch (op) { case 0: // 加法 if (a + b + c == 24 || a + b - c == 24 || a + c - b == 24) return 1; break; case 1: // 减法 if (a + b - c == 24 || a - b + c == 24 || a - c + b == 24) return 1; break; case 2: // 乘法 if (a * b / c == 24 || a * b * c == 24 || a / b * c == 24) return 1; break; case 3: // 除法 if (a * b / c == 24 || a * c / b == 24 || a / b / c == 24) return 1; break; } } } } } return 0; // 如果找不到解决方案,返回0 } int main() { int nums[] = {5, 3, 9, 8}; // 示例输入数组 int count = sizeof(nums) / sizeof(nums); if (is_24(nums, count)) { printf("Solution found: %d + %d * (%d - %d)\n", nums, nums, nums, nums); } else { printf("No solution found.\n"); } return 0; } ``` 这个程序会检查给定的一组数字是否可以通过加、减、乘、除运算得到24。注意,这只是一个基本版本,实际应用中可能需要更复杂的逻辑处理用户输入、错误检查等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值