24点运算

  1. #include <iostream>  
  2. #include <string>  
  3. #include <algorithm>  
  4.   
  5. using namespace std;  
  6.   
  7.   
  8. string poker[] = { "A""2""3""4""5""6""7""8""9""10""J""Q""K" };  
  9. char C[12] = { '+''+''+''-''-''-''*''*''*''/''/''/' };  
  10.   
  11. int Calculate(int a, int b, char c)  
  12. {  
  13.     switch (c){  
  14.         case '+'return a + b;  
  15.         case '-'return a - b;  
  16.         case '*'return a * b;  
  17.         case '/'return a / b;  
  18.         defaultreturn -1;  //不会有这个选项  
  19.     }  
  20. }  
  21.   
  22. int Caculate24(int a, int b, int c, int d, char C1, char C2, char C3)  
  23. {  
  24.     return Calculate(Calculate(Calculate(a, b, C1), c, C2), d, C3);  
  25. }  
  26.   
  27. bool Count24(int a, int b, int c, int d)  
  28. {  
  29.     sort(C, C + 12);  
  30.       
  31.     do {  
  32.         if (Caculate24(a, b, c, d, C[0], C[1], C[2]) == 24){  
  33.             //do right;  
  34.               
  35.             return true;  
  36.         }  
  37.     } while (next_permutation(C, C + 12));  
  38.       
  39.     return false;  
  40. }  
  41.   
  42.   
  43. int main()  
  44. {  
  45.     string str[4];  
  46.     cin >> str[0] >> str[1] >> str[2] >> str[3];  
  47.     int i, j;  
  48.     bool legal;  
  49.     for (i = 0; i < 4; i++){  
  50.         legal = false;  
  51.         for (j = 0; j < 13; j++){  
  52.             if (str[i].compare(poker[j].c_str()) == 0)  
  53.                 legal = true;  
  54.         }  
  55.         if (legal == false){  
  56.             cout << "ERROR" << endl;  
  57.             return 0;  
  58.         }  
  59.     }  
  60.       
  61.     int a, b, c, d;  
  62.     string *p;  
  63.     p = find(poker, poker + 13, str[0]);  
  64.     a = p - poker + 1;  
  65.     p = find(poker, poker + 13, str[1]);  
  66.     b = p - poker + 1;  
  67.     p = find(poker, poker + 13, str[2]);  
  68.     c = p - poker + 1;  
  69.     p = find(poker, poker + 13, str[3]);  
  70.     d = p - poker + 1;  
  71.       
  72.     //现在a, b, c, d分别代表每一张牌的数值  
  73.     int num[4];  
  74.     num[0] = a, num[1] = b, num[2] = c, num[3] = d;  
  75.       
  76.     do {  
  77.         if (Count24(num[0], num[1], num[2], num[3])){  
  78.             cout << poker[num[0] - 1] << C[0] << poker[num[1] - 1] << C[1] << poker[num[2] - 1] << C[2] << poker[num[3] - 1] << endl;  
  79.             return 0;  
  80.         }  
  81.     } while (next_permutation(num, num+4));  
  82.     cout << "NONE" << endl;  
  83.     return 0;  
  84. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值