题解 | #24点游戏算法#

#include <bits/stdc++.h>

using namespace std;

double num = 1e-6;
int ANS = 24;
int ADD = 0, SUB = 1, MUL = 2, DIV = 3;

bool process(vector<double>& l){
    if(l.size() == 0) return false;
    if(l.size() == 1) return abs(24 - l[0]) < num; //只剩一个数字
    
    int size = l.size(); //
    for(int i = 0; i < size; i++){
        for(int j = 0; j < size; j++){
            if(i != j){ //两个索引不能相等
                vector<double> l2;
                for(int k = 0; k < size; k++){
                    if(k != i && k != j){
                        l2.push_back(l[k]);//先将本轮不做处理的数字放进去
                    }
                }   
                
                //"二合一"
                for(int m = 0; m < 4; m++){ //四种处理:加减乘除
                    if(m == ADD){
                        l2.push_back(l[i] + l[j]);
                    }
                    else if(m == SUB){
                        l2.push_back(l[i] - l[j]);
                    }
                    else if(m == MUL){
                        l2.push_back(l[i] * l[j]);
                    }
                    else{
                        if(abs(l[j]) < num) continue; //除的时候分母不能为0
                        l2.push_back(l[i] / l[j]);
                    }
                    
                    if(process(l2)){
                        return true; //
                    }
                    
                    l2.pop_back(); //
                }                                
            }
        }
    }
    return false;
}

int main(){
    int a = 0, b = 0, c = 0, d = 0;
    while(cin >> a >> b >> c >> d){
        //二合一 + dfs
        vector<double> l1;
        l1.push_back((double)a);
        l1.push_back((double)b);
        l1.push_back((double)c);
        l1.push_back((double)d);
        
        bool res = process(l1);
        
        if(res)
            cout << "true" << endl;
        else
            cout << "false" << endl;
    }
    
    return 0;
}
全部评论

相关推荐

讯飞老萌新:站住!有人25还没有找到工作的吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务