帖一个VS能输出24点全部组合的代码
24点运算
http://www.nowcoder.com/questionTerminal/7e124483271e4c979a82eb2956544f9d
帖一个自己写的,VS能输出24点全部组合的代码。
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<cmath>
#include<unordered_map>
#include<algorithm>
#include<stack>
using namespace std;
vector<string> table = { "#","A","2","3","4","5","6","7","8","9","10","J","Q","K","joker","JOKER" };
string op_tb = "+-*/";
string temp = "";
vector<string> ans;
double res;
vector<vector<int>> r;
vector<int> t;
void dfs(const vector<int>& nums, char op, int flag) {
if (flag > 3) {
if (res == 24 && find(ans.begin(), ans.end(), temp.substr(0, temp.size() - 1)) == ans.end())
ans.push_back(temp.substr(0, temp.size() - 1));
return;
}
if (flag == 0)
res = nums[flag];
else if (op == '+')
res += nums[flag];
else if (op == '-')
res -= nums[flag];
else if (op == '*')
res *= nums[flag];
else if (op == '/')
res /= nums[flag];
else
cout << "NOPE OP" << endl;
double d = res;
temp += table[nums[flag]];
string s = temp;
for (int i = 0; i < 4; i++)
{
temp += op_tb[i];
dfs(nums, op_tb[i], flag + 1);
res = d;
temp = s;
}
}
void backtrack(const vector<int>& nums)
{
if (t.size() == nums.size()) {
r.push_back(t);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (find(t.begin(), t.end(), nums[i]) != t.end())
continue;
t.push_back(nums[i]);
backtrack(nums);
t.pop_back();
}
}
int main()
{
while (1) {
temp.clear(); ans.clear(); t.clear(); r.clear(); bool ff = false;
cout << "Input 4 cards: " << endl;
vector<int> nums(4);
for (int i = 0; i < 4; i++) {
string s;
cin >> s;
if (s == "joker" || s == "JOKER")
{
ff = true; cout << "Contains joker, error!" << endl;
}
else if (find(table.begin(), table.end(), s) != table.end())
nums[i] = find(table.begin(), table.end(), s) - table.begin();
else
cout << "Wrong input!" << endl << "----------------" << endl;
}
if (ff)
continue;
vector<int> nums_1 = { 0,1,2,3 };
backtrack(nums_1);
for (int i = 0; i < r.size(); i++)
{
for (int j = 0; j < r[i].size(); j++)
r[i][j] = nums[r[i][j]];
}
for (auto e : r) {
temp.clear();
dfs(e, ' ', 0);
}
if (ans.size() == 0)
cout << "Can not sum in 24!" << endl << "-------------" << endl;
else {
cout << "Cards can be combined into 24 as follows: " << endl;
for (auto e : ans)
{
for (int j = 0; j < e.size(); j++)
cout << e[j];
cout << endl;
}
cout << "-------------" << endl;
}
}
system("pause");
return 0;
}