题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
#include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; vector<string> a(4); vector<int> arr; vector<char> op = { '+', '-', '*', '/' }; vector<vector<char>> all; // a数组存储牌面字符串 // arr数组是用来存储我们输入的四位数字的 // 我们的op数组是我们的四个符号位的一个数组 // 我们这个表达式里面一共是需要三个符号的 // 我们的这个all就是我们四个选项选三个然后排列组合的所有的可能 int getvalue(string s){ //根据输入的字符串首字母输出对应值 switch(s[0]){ case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case '1': return 10; //用1代替10 case 'J': return 11; case 'Q': return 12; case 'K': return 13; case 'A': return 1; case '2': return 2; } return 0; } string getcard(int value){ //根据输入值转变成牌面字符串 switch(value){ case 3: return "3"; case 4: return "4"; case 5: return "5"; case 6: return "6"; case 7: return "7"; case 8: return "8"; case 9: return "9"; case 10: return "10"; case 11: return "J"; case 12: return "Q"; case 13: return "K"; case 1: return "A"; case 2: return "2"; } return "NOCARD"; } void init() { for (auto& it1 : op) { // it1代表的是我们第一个的符号位是什么 for (auto& it2 : op) { // it2代表的是我们第二个的符号是什么 for (auto& it3 : op) { // it3代表的是我们第三个符号位是什么 vector<char> tmp(3); // 这里我们开辟的tmp是我们临时的一个存储三个符号位的数组 tmp[0] = it1, tmp[1] = it2, tmp[2] = it3; // 我们将我们枚举出来的符号位放到这个数组里面 all.push_back(tmp); // 然后将我们的可能塞入我们的这个all的数组中 } } } } // 这个是用来计算值的,判断我们的符号然后进行一个运算 int cal(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; } return 0; } void solve() { sort(arr.begin(), arr.end()); // 因为我们的c++内的全排列函数要求是要从小到大的数组,所以我们排一下序 do { for (auto &it : all) { // 遍历所有的符号集的所有可能 int res = arr[0]; // 因为我们有四个数字,但是只有三个符号,所以我们先把答案设置为第一个数字 int index = 0; // 这个是我们符号数组的下标 for (int i = 1; i <= 3; i++) res = cal(res, arr[i], it[index++]); // 计算我们当前这个符号集下的答案会是多少 if (res == 24) { cout << getcard(arr[0]) << it[0] << getcard(arr[1]) << it[1] << getcard(arr[2]) << it[2] << getcard(arr[3]); return; } // 如果已经是等于了24,那么我们可以不用管其他的了,直接就是可以把他输出,然后退出即可 } } while (next_permutation(arr.begin(), arr.end())); // 这个是我们执行了一个全排列 cout << "NONE"; // 执行完了所有的都没有答案,我们输出NONE } signed main() { init(); while (cin >> a[0] >> a[1] >> a[2] >> a[3]) { for (auto x : a) { if (x == "joker" || x == "JOKER") { cout << "ERROR";//有大小王直接输出ERROR并退出 return 0; } } for (auto x : a) { arr.push_back(getvalue(x));//字符串向量转成int向量 } solve(); } return 0; }