题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
#include <cctype> #include <iostream> #include <map> #include <vector> #include <string> #include <algorithm> #include <stack> using namespace std; vector<char> symbol = {'+', '-', '*', '/'}; vector<string> pok = {"A","2","3","4","5","6","7","8","9","10","J","Q","K",}; bool calculate(string s) { stack<int> st; int n = s.size(), loc = 0, sum = 0; char sy = '+'; string tm; while (loc <= n) { if (loc < n && isdigit(s[loc])) { tm += s[loc]; } else if ((loc == n) || (loc < n && !isdigit(s[loc]))) { switch (sy) { case '+': sum += stoi(tm); tm.clear(); break; case '-': sum -= stoi(tm); tm.clear(); break; case '*': sum *= stoi(tm); tm.clear(); break; case '/': sum /= stoi(tm); tm.clear(); break; } sy = s[loc]; } ++loc; } if(sum == 24){ return true; }else { return false; } } bool combination(vector<int> ins) { string s; sort(ins.begin(), ins.end()); do { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { for (int k = 0; k < 4; k++) { s = to_string(ins[0]) + symbol[i] + to_string(ins[1]) + symbol[j] + to_string(ins[2]) + symbol[k] + to_string(ins[3]); if (calculate(s)) { s = pok[ins[0] - 1] + symbol[i] + pok[ins[1] - 1] + symbol[j] + pok[ins[2] - 1] + symbol[k] + pok[ins[3] - 1]; cout << s << endl; return true; } } } } } while (next_permutation(ins.begin(), ins.end())); return false; } int main() { map<string, int> mp = {{"3", 3}, {"4", 4}, {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9}, {"10", 10}, {"J", 11}, {"Q", 12}, {"K", 13}, {"A", 1}, {"2", 2}}; string s; vector<int> ins; while (cin >> s) { if (mp.find(s) == mp.end()) { cout << "ERROR" << endl; return 0; } else { ins.push_back(mp[s]); } } if (!combination(ins)) { cout << "NONE" << endl; return 0; } return 0; } // 64 位输出请用 printf("%lld")
注意该题目的特殊运算顺序