24点小游戏~
cpp 1#include <iostream> 2 3#include <algorithm> 4#include <string> 5#include <vector> 6#include <stack> 7#include <queue> 8#include <set> 9#include <map> 10#include <unordered_map> 11#include <unordered_set> 12#include <random> 13#include <chrono> 14 15#include <cstdio> 16#include <cstring> 17#include <cmath> 18#include <ctime> 19#include <cstdlib> 20#include <cassert> 21 22#define itn int 23#define fro for 24#define scnaf scanf 25#define sacnf scanf 26#define manx maxn 27#define pritnf printf 28 29#define Fastin freopen("in.txt", "r", stdin) 30#define Fastout freopen("out.txt", "w", stdout) 31#define min(a, b) ((a) < (b)? (a): (b)) 32#define max(a, b) ((a) > (b)? (a): (b)) 33#define lowbit(x) ((x) & (-x)) 34#define ceil(n, p) (((n) +(p) - 1) / (p)) 35#define DBG(x) (void)(cout << "L" << __LINE__ << ": " << #x << " = " <<( x) << '\n') 36#define clr(a, x) memset((a), x, sizeof (a)) 37#define TTT int __; scanf("%d", &__); while(__--) 38using namespace std; 39typedef long long ll; 40 41int a[5], b[5], p[5]; 42 43struct NODE{ 44 string s; double w; 45 bool operator < (const NODE& b)const{return s < b.s;} 46}; 47set<NODE> s[5][5]; 48//处理[left, right]的值 49void sove(int left, int right){ 50 if(left > right) return ; 51 if(left == right){ 52 NODE temp; 53 temp.s = to_string(a[left]); temp.w = a[left]; 54 s[left][right].insert(temp); 55 return; 56 } 57 for(int i = left; i <= right - 1; i++){ 58 sove(left, i); sove(i + 1, right); 59 NODE temp; 60 for(auto x: s[left][i]) for(auto y: s[i + 1][right]){ 61 temp.s = x.s; if(left != i) temp.s = "(" + temp.s + ")"; 62 temp.s += "+"; temp.w = x.w + y.w; 63 if(i + 1 != right) temp.s += "(" + y.s + ")"; 64 else temp.s += y.s; 65 s[left][right].insert(temp); 66 67 temp.s = x.s; if(left != i) temp.s = "(" + temp.s + ")"; 68 temp.s += "-"; temp.w = x.w - y.w; 69 if(i + 1 != right) temp.s += "(" + y.s + ")"; 70 else temp.s += y.s; 71 s[left][right].insert(temp); 72 73 temp.s = x.s; if(left != i) temp.s = "(" + temp.s + ")"; 74 temp.s += "*"; temp.w = x.w * y.w; 75 if(i + 1 != right) temp.s += "(" + y.s + ")"; 76 else temp.s += y.s; 77 s[left][right].insert(temp); 78 79 if(y.w == 0) continue; 80 temp.s = x.s; if(left != i) temp.s = "(" + temp.s + ")"; 81 temp.s += "/"; temp.w = x.w / y.w; 82 if(i + 1 != right) temp.s += "(" + y.s + ")"; 83 else temp.s += y.s; 84 s[left][right].insert(temp); 85 } 86 87 } 88} 89 90const double eps = 1e-6; 91set<string> ans; 92 93int main(){ 94// Fastin; 95 for(int i = 1; i <= 4; i++) scnaf("%d", b + i); 96 p[1] = 1; p[2] = 2; p[3] = 3; p[4] = 4; 97 98 do{ 99 for(int i = 0; i < 5; i++) for(int j = 0; j < 5; j++) s[i][j].clear(); 100 for(int i = 1; i <= 4; i++) a[i] = b[p[i]]; 101 sove(1, 4); 102 for(auto x: s[1][4]) if(abs(x.w - 24) <= eps){ 103 ans.insert(x.s); 104 } 105 }while(next_permutation(p + 1, p + 5)); 106 107 if(ans.empty()) puts("-1"); 108 else for(auto s: ans) cout << s << '\n'; 109 return 0; 110}