题目:
考察知识点:深搜(dfs)
思路:
暴力枚举每种可能的情况,统计计算结果等于24的情况的数量。
计算时,注意遇到乘号时的处理:若+,- 号的下一个运算符是乘号,先将后面的乘完再进行加或减
代码:
'算法' ( times:11ms )
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N], w[N];
int n, ans;
void dfs(int u)
{
if (u == n)
{
int res = a[1];
for (int i = 1; i < n; i++)
{
if (i == 1 && w[i] == 3)
{
res = 0;
int tem = a[1];
while (w[i] == 3 && i < n)
{
tem *= a[i + 1];
i++;
}
i--;
res = tem;
}
else if (w[i] == 1)
{
if (w[i + 1] == 3)
{
int tem = a[i + 1];
while (w[i + 1] == 3 && i + 1 < n)
{
tem *= a[i + 2];
i++;
}
i--;
res += tem;
}
else
res += a[i + 1];
}
else if (w[i] == 2)
{
if (w[i + 1] == 3)
{
int tem = a[i + 1];
while (w[i + 1] == 3 && i + 1 < n)
{
tem *= a[i + 2];
i++;
}
i--;
res -= tem;
}
else
res -= a[i + 1];
}
}
if (res == 24)
ans++;
return;
}
for (int i = 1; i <= 3; i++)
{
w[u] = i;
dfs(u + 1);
}
}
signed main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
dfs(1);
printf("%d", ans);
return 0;
}