• 1.16 24点游戏


    24点游戏的解决办法,也是采取穷举法的思路,4个数,有4!=24中排列的方法,然后3个操作符号,有4×4×4 = 64种结果,再加上括号,有5种结果,于是,每4个数有24*66*5 = 7680中结果。

    为了简便计算,原书中给出的第一种方法采取这样一种递归的思路:

      1 /*
      2 <编程之美>
      3 深搜 
      4 遍历运算符, 数和括号的所有排列形式 
      5 */
      6 #include <iostream>
      7 #include <string>
      8 #include <math.h>
      9 
     10 using namespace std;
     11 
     12 const  double Threshold = 1e-6;
     13 const int CardsNumber = 4;
     14 const int ResultValue = 24;
     15 double number[CardsNumber];
     16 string result[CardsNumber];
     17 
     18 bool PointGame(int n)
     19 {
     20     if(n == 1)
     21     {
     22         if(fabs(number[0] - ResultValue) < Threshold)
     23         {
     24             cout << result[0] << endl;
     25             return true;
     26         }
     27         else
     28         {
     29             return false;
     30         }
     31     }
     32     
     33     for(int i = 0; i < n; i++)
     34     {
     35         for(int j = i +1 ; j < n; j++)
     36         {
     37             double a, b;
     38             string expa, expb;
     39             
     40             a = number[i];
     41             b = number[j];
     42             number[j] = number[n - 1];
     43             
     44             expa = result[i];
     45             expb = result[j];
     46             result[j] = result[n-1];
     47             
     48             //+加法操作 a+b
     49             number[i] = a + b;
     50             result[i] = '(' + expa + '+' + expb + ')';
     51             if(PointGame(n-1))
     52             {
     53                 return true;
     54             }
     55             
     56             //减法操作 a-b
     57             number[i] = a - b;
     58             result[i] = '(' + expa + '-' + expb + ')';
     59             if(PointGame(n-1))
     60             {
     61                 return true;
     62             }
     63             
     64             //减法操作 b-a
     65             number[i] = b - a;
     66             result[i] = '(' + expb + '-' + expa + ')';
     67             if(PointGame(n-1))
     68             {
     69                 return true;
     70             }
     71             
     72             //乘法操作 a*b 
     73             number[i] = a * b;
     74             result[i] = '(' + expa + '*' + expb + ')';
     75             if(PointGame(n-1))
     76             {
     77                 return true;
     78             }
     79             
     80             //除法操作 a/b, 如果除数不为0 
     81             if(b != 0)
     82             {
     83                 number[i] = a / b;
     84                 result[i] = '(' + expa + '/' + expb + ')';
     85                 if(PointGame(n-1))
     86                 {
     87                     return true;
     88                 }
     89             }                     
     90             
     91             //除法操作 b/a , 如果除数不为0 
     92             if(a != 0)
     93             {
     94                 number[i] = b / a;
     95                 result[i] = '(' + expb + '/' + expa + ')';
     96                 if(PointGame(n-1))
     97                 {
     98                     return true;
     99                 }
    100             }
    101             
    102             number[i] = a;
    103             number[j] = b;
    104             result[i] = expa;
    105             result[j] = expb;
    106             
    107         }
    108     }
    109     return false;
    110     
    111 }
    112 
    113 int main()
    114 {
    115     int x;
    116     for(int i =0; i< CardsNumber; i++)
    117     {
    118         char buffer[20];
    119         cout << "the " << i << "the number: ";
    120         cin >> x;
    121         number[i] = x;
    122         itoa(x,buffer,10);
    123         result[i] = buffer;
    124 
    125     }
    126     
    127     if(PointGame(CardsNumber))
    128     {
    129         cout << "Success" << endl;
    130         
    131     }
    132     else
    133     {
    134         cout << "failure" << endl;
    135     }
    136     system("pause");    
    137     return 0;
    138 }
  • 相关阅读:
    【Spring Framework】10、代理模式
    【Spring Framework】8、使用注解开发
    Codeforces 516E
    AtCoder Grand Contest 055 题解
    Codeforces 1606F
    贪心/构造/DP 杂题选做
    整数拆分最大乘积
    CSP-S2021 被碾压记
    洛谷 P2791
    LCT 小记
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2615014.html
Copyright © 2020-2023  润新知