【OpenJudge 1789】算24(枚举)

来源:互联网 发布:联通3g网络速度 编辑:程序博客网 时间:2024/06/03 13:29

传送门biu~
这题需要神(S)犇(B)的小技巧
我们每次取出两个数,并用加减乘除合并它们
当最后剩下一个数的时候,看看它是不是等于24就可以了(注意精度问题)

#include<bits/stdc++.h>#define DEINF -2147483647using 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;}
原创粉丝点击