Openjudge---算24

来源:互联网 发布:易语言视频解析源码 编辑:程序博客网 时间:2024/06/05 04:19

1789:算24
总时间限制:
3000ms
内存限制:
65536kB

描述
给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。

这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。

输入
输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
输出
对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
样例输入

5 5 5 11 1 4 20 0 0 0

样例输出

YESNO

状态: Accepted

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const double eps=0.00000001;double a[4];int v[4];double mabs(double x)//mabs取绝对值 {return x>0?x:-x;}int dfs(int x){    if (x==3)    {      for (int i=0;i<4;i++)        if (!v[i] && mabs(a[i]-24.0)<eps) return 1;      return 0;    }    for (int i=0;i<4;i++)     if (!v[i])      for (int j=i+1;j<4;j++)//区别       if (!v[j])       {         v[j]=1;         double tmp=a[i],tmpp=a[j];         a[i]=tmp+tmpp;         if (dfs(x+1)) return 1;         a[i]=tmp-tmpp;         if (dfs(x+1)) return 1;         a[i]=tmpp-tmp;         if (dfs(x+1)) return 1;         a[i]=tmpp*tmp;         if (dfs(x+1)) return 1;         a[i]=tmpp/tmp;         if (dfs(x+1)) return 1;         a[i]=tmp/tmpp;         if (dfs(x+1)) return 1;         a[i]=tmp;         v[j]=0;       }    return 0;}int main(){    while (1)    {      for (int i=0;i<4;i++) scanf("%lf",&a[i]);      if (!a[0]) break;      memset(v,0,sizeof(v));      if (dfs(0)) printf("YES\n");      else printf("NO\n");    }    return 0;}
原创粉丝点击