算24点c++实现

算24点的经典方法

#include <bits/stdc++.h>
using namespace std;

/**
 * 尝试从 arr 中选出任意两个数 a、b,用四则运算合并它们,递归检验能否得到 24。
 * @param arr 当前可用数字(浮点数)
 * @return 若能组成 24,返回 true,否则返回 false
 */
bool canMake24(vector<double> &arr) {
    // 递归基:如果只剩一个数,判断它是否与 24 足够接近
    if (arr.size() == 1) {
        return fabs(arr[0] - 24.0) < 1e-6;
    }

    // 遍历数组,选出两数 a、b,进行加减乘除,再继续递归
    for (int i = 0; i < (int)arr.size(); i++) {
        for (int j = i + 1; j < (int)arr.size(); j++) {
            double a = arr[i], b = arr[j];
            // 先将这两个数从数组移除
            vector<double> next;
            for (int k = 0; k < (int)arr.size(); k++) {
                if (k != i && k != j) {
                    next.push_back(arr[k]);
                }
            }

            // 尝试各种合法运算
            vector<double> results = {a + b, a - b, b - a, a * b};
            if (fabs(b) > 1e-6) { 
                results.push_back(a / b);
            }
            if (fabs(a) > 1e-6) {
                results.push_back(b / a);
            }

            // 将每个运算结果合并到数组,再递归判断
            for (double r : results) {
                next.push_back(r);
                if (canMake24(next)) {
                    return true;
                }
                next.pop_back(); // 回溯
            }
        }
    }
    return false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t; // 测试次数

    while (t--) {
        vector<double> nums(4);
        for (int i = 0; i < 4; ++i) {
            cin >> nums[i];
        }
        // 判断这 4 个数能否通过四则运算组成 24
        cout << (canMake24(nums) ? "YES" : "NO") << "\n";
    }
    
    return 0;
}
posted @   bakul  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示