题意
题解
枚举牌的排列,共 4 ! 4! 4! 种可能;枚举计算使用的 3 3 3 个操作符,共 4 3 4^3 43 种可能;枚举计算的顺序,共 3 ! 3! 3! 种可能。实现上使用优先级处理表达式计算的顺序,用栈计算表达式即可;当然,递归的实现更为简便。
class Solution
{
#define eps 1e-10
public:
void op1(stack<double> &ns, stack<int> &os, stack<int> &rk, double n, int op, int rnk)
{
ns.push(n);
os.push(op);
rk.push(rnk);
}
bool op2(stack<double> &ns, stack<int> &os, stack<int> &rk)
{
double n2 = ns.top(); ns.pop();
double n1 = ns.top(); ns.pop();
int op = os.top(); os.pop(); rk.pop();
if (abs(n2) < eps && op == 3) return 0;
switch (op)
{
case 0: n1 += n2; break;
case 1: n1 -= n2; break;
case 2: n1 *= n2; break;
case 3: n1 /= n2; break;
}
ns.push(n1);
return 1;
}
double fun(vector<int> &num, vector<int> &op, vector<int> &rnk)
{
stack<double> ns;
stack<int> os, rk;
ns.push(num[0]);
for (int i = 1, j = 0; j < 3; ++i, ++j)
{
if (rk.empty() || rk.top() < rnk[j])
{
op1(ns, os, rk, num[i], op[j], rnk[j]);
}
else
{
while (!rk.empty() && rk.top() > rnk[j])
{
if (!op2(ns, os, rk)) return INT_MAX;
}
op1(ns, os, rk, num[i], op[j], rnk[j]);
}
}
while (!os.empty())
{
if (!op2(ns, os, rk)) return INT_MAX;
}
return ns.top();
}
bool judgePoint24(vector<int> &nums)
{
vector<int> op(3), rnk(3);
bool f = 0;
sort(nums.begin(), nums.end());
do
{
for (int i = 0; !f && i < 4; i++)
{
for (int j = 0; !f && j < 4; j++)
{
for (int k = 0; !f && k < 4; k++)
{
op[0] = i, op[1] = j, op[2] = k;
rnk[0] = 0, rnk[1] = 1, rnk[2] = 2;
do
{
if (abs(fun(nums, op, rnk) - 24) < eps)
{
f = 1;
break;
}
} while (!f && next_permutation(rnk.begin(), rnk.end()));
}
}
}
} while (!f && next_permutation(nums.begin(), nums.end()));
return f;
}
};