T750414 【游戏】计算24点 题解

题目描述

24 点是一个经典的纸牌数学游戏:从牌堆中翻出 4 张牌,每张牌上有一个 1 到 13 的正整数(对应 A 到 K)。你需要对这 4 个数进行加(+)、减(−)、乘(×)、除(÷)运算,可以使用括号改变运算顺序,使结果恰好等于 24。每个数必须恰好使用一次

注意:除法为实数除法(不是整除),例如 8÷3=2.666...。

现在共有 10 组数据,每组给定 4 个正整数,请判断每组能否算出 24。

输入格式

共 10 行,每行 4 个正整数 a,b,c,d。

输出格式

共 10 行,对于每组数据,若能算出 24 则输出 Yes,否则输出 No

输入输出样例

输入 #1复制

复制代码
1 2 3 4
1 1 1 1
3 3 8 8
1 5 5 5
6 6 6 6
13 13 13 13
1 3 4 6
1 1 2 7
7 7 7 7
4 4 10 10

输出 #1复制

复制代码
Yes
No
Yes
Yes
Yes
No
Yes
Yes
No
Yes

说明/提示

样例解释:

  • 第 1 组:1×2×3×4=24。
  • 第 2 组:四个 1 无论如何运算都无法得到 24。
  • 第 3 组:8÷(3−8÷3)=8÷31=24,需要使用实数除法。
  • 第 4 组:5×(5−1÷5)=5×4.8=24。
  • 第 5 组:6+6+6+6=24。
  • 第 8 组:(7+1)×(1+2)=8×3=24,需要 (a∘b)∘(c∘d) 形式的括号结构。
  • 第 10 组:(10×10−4)÷4=96÷4=24。

数据范围:

数据占比 约束条件
100% 1≤a,b,c,d≤13

思路:

大模拟,先枚举位置,再枚举符号。

代码:

cpp 复制代码
#include <bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
db a,b,c,d;
bool kill(db a,db b,db c,db d){
    for(int i=1;i<=6;i++){
        for(int j=1;j<=6;j++){
            for(int k=1;k<=6;k++){
                db q,w,e,r;
                q=a*1.0;
                w=b*1.0;
                e=c*1.0;
                r=d*1.0;
                if(i==1) w=q+w;
                if(i==2) w=q-w;
                if(i==3) w=q/w;
                if(i==5) w=w/q;
                if(i==6) w=w-q;
                if(i==4) w=q*w;
                if(j==1) e=e+w;
                if(j==2) e=e-w;
                if(j==3) e=e*w;
                if(j==4) e=e/w;
                if(j==5) e=w/e;
                if(j==6) e=w-e;
                if(k==1) r=e/r;
                if(k==2) r=e*r;
                if(k==3) r=e-r;
                if(k==4) r=e+r;
                if(k==5) r=r/e;
                if(k==6) r=r-e;
                if(fabs(r-24)<1e-6) return true;
            }
        }
    }
    for(int i=1;i<=6;i++){
        for(int j=1;j<=6;j++){
            for(int k=1;k<=6;k++){
                db q,w,e,r;
                q=a*1.0;
                w=b*1.0;
                e=c*1.0;
                r=d*1.0;
                if(i==1) w=q+w;
                if(i==2) w=q-w;
                if(i==3) w=q/w;
                if(i==5) w=w/q;
                if(i==6) w=w-q;
                if(i==4) w=q*w;
                if(k==1) e=e/r;
                if(k==2) e=e*r;
                if(k==3) e=e-r;
                if(k==4) e=e+r;
                if(k==5) e=r/e;
                if(k==6) e=r-e;
                if(j==1) r=e+w;
                if(j==2) r=e-w;
                if(j==3) r=e*w;
                if(j==4) r=e/w;
                if(j==5) r=w/e;
                if(j==6) r=w-e;
                if(fabs(r-24)<1e-6) return true;
            }
        }
    }
    return false;
}
bool work(db a,db b,db c,db d){
    for(int aw=1;aw<=4;aw++){
        for(int bw=1;bw<=4;bw++){
            if(bw==aw) continue;
            for(int cw=1;cw<=4;cw++){
                if(cw==aw||cw==bw) continue;
                for(int dw=1;dw<=4;dw++){
                    if(dw==aw||dw==cw||dw==bw) continue;
                    int q,w,e,r;
                    if(aw==1) q=a*1.0;
                    if(aw==2) w=a*1.0;
                    if(aw==3) e=a*1.0;
                    if(aw==4) r=a*1.0;
                    if(bw==1) q=b*1.0;
                    if(bw==2) w=b*1.0;
                    if(bw==3) e=b*1.0;
                    if(bw==4) r=b*1.0;
                    if(cw==1) q=c*1.0;
                    if(cw==2) w=c*1.0;
                    if(cw==3) e=c*1.0;
                    if(cw==4) r=c*1.0;
                    if(dw==1) q=d*1.0;
                    if(dw==2) w=d*1.0;
                    if(dw==3) e=d*1.0;
                    if(dw==4) r=d*1.0;
                    if(kill(q,w,e,r))return true;
                }
            }
        }
    }
    return false;
}
signed main(){
	cin.tie(0)->sync_with_stdio(false);
	int t=10;
    while(t--){
        cin>>a>>b>>c>>d;
        if(work(a,b,c,d)) cout<<"Yes\n";
        else cout<<"No\n";
    }
	return 0;
}
相关推荐
草莓熊Lotso1 小时前
【LangChain】核心组件详解:文档加载器(Document Loaders)
开发语言·c++·python·langchain·软件工程
手写码匠2 小时前
Android 17 灵魂拷问深度解析:隐私、大屏、AI 端侧全面适配实战
人工智能·深度学习·算法·aigc
自然常数e2 小时前
顺序表专题
c语言·数据结构·visual studio
ysa0510302 小时前
优先队列贪心dp
c++·笔记·算法·板子
小七在进步2 小时前
数据结构:树的遍历
数据结构
j7~3 小时前
【数据结构初阶】队列的实现(链式队列 + 循环队列)--详解
c语言·开发语言·数据结构·学习·队列·queue·c\c++
草莓熊Lotso3 小时前
【Linux网络】深入理解Linux IO多路复用:select服务器完善、内核原理与poll实战
linux·运维·服务器·c语言·网络·c++
Andy3 小时前
Cpp进阶语法详解
c++
道影子3 小时前
《道德经》031兵者不祥,胜以丧礼处之
人工智能·深度学习·算法