题目描述
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;
}