(C++)数字游戏 时限:1s 空间:256m 格莱尔非常喜欢“简化版计算24”的数字游戏,其游戏规则是:对4个1~9的自然数,进行加、减、乘三种运算,要求运算结果等于24,乘法的优先级高于加法和减法,并且算式中不可以用括号,不可以改变4个数字出现的顺序。 如给出的4个数(可以相同,也可以互不相同)是6、6、6、6,则有两种可能的解答方案:6+6+6+6=24,6*6-6-6=24,输出内容:2。 如给出的4个数是2、3、6、7,则没有解答方案,输出内容:0。 输入格式 一行,包含4个整数(1<=整数<=9),数与数之间以一个空格隔开。 输出格式 一行,一个整数,表示可解答的方案总数。
时间: 2024-02-11 13:08:31 浏览: 162
以下是 C++ 的代码实现:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int calculate(int a, int b, char op) {
if (op == '+') {
return a + b;
} else if (op == '-') {
return a - b;
} else if (op == '*') {
return a * b;
}
return 0;
}
bool dfs(vector<int>& nums, int cur, int res) {
if (cur == 4) {
return res == 24;
}
for (int i = 0; i < 4; i++) {
if (dfs(nums, cur + 1, calculate(res, nums[i], '+'))) {
return true;
}
if (dfs(nums, cur + 1, calculate(res, nums[i], '-'))) {
return true;
}
if (dfs(nums, cur + 1, calculate(res, nums[i], '*'))) {
return true;
}
}
return false;
}
int solve(vector<int>& nums) {
int cnt = 0;
sort(nums.begin(), nums.end());
do {
if (dfs(nums, 1, nums[0])) {
cnt++;
}
} while (next_permutation(nums.begin(), nums.end()));
return cnt;
}
int main() {
vector<int> nums(4);
for (int i = 0; i < 4; i++) {
cin >> nums[i];
}
cout << solve(nums) << endl;
return 0;
}
```
解题思路:
1. 首先对4个数字进行排列,共有 $4!=24$ 种可能性。
2. 针对每种排列,依次尝试所有可能的运算符组合,计算出该组合的结果。
3. 如果计算结果等于24,则将计数器加1。
4. 最终输出计数器的值即可。
由于是暴力枚举,时间复杂度为 $O(24\times3^3\times4^3)=O(82944)$,可以在1秒内完成计算。
阅读全文