您的位置:首页 > 运维架构

【OpenJudge 1789】算24(枚举)

2017-09-06 21:34 183 查看
传送门biu~

这题需要神(S)犇(B)的小技巧

我们每次取出两个数,并用加减乘除合并它们

当最后剩下一个数的时候,看看它是不是等于24就可以了(注意精度问题)

#include<bits/stdc++.h>
#define DEINF -2147483647
using namespace std;
bool flag;
double a[5];
double ys(double x,double y,int num)
{
if(num==1)      return x+y;
else if(num==2) return x-y;
else if(num==3) return x*y;
else if(num==4) return x/y;
}
void dfs(int x)
{
sort(a+1,a+5);
if(flag)        return;
if(x==4)
{
if(abs(a[4]-24)<0.001)      flag=1;
return;
}
double b[5];for(int i=1;i<=4;++i)b[i]=a[i];
for(int i=x;i<=4;++i)
{
for(int j=x;j<=4;++j)
{
if(i==j)        continue;
for(int k=1;k<=4;++k)
{
a[i]=ys(a[i],a[j],k);
a[j]=DEINF;
dfs(x+1);
for(int i=1;i<=4;++i)a[i]=b[i];
}
}
}
}
int main()
{
while(~scanf("%lf%lf%lf%lf",&a[1],&a[2],&a[3],&a[4]) && a[1])
{
flag=0;
dfs(1);
printf(flag?"YES\n":"NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: