zoukankan      html  css  js  c++  java
  • oj2787 算24

     1 #include<math.h>
     2 #include<stdio.h>
     3 #define Z 1e-6 //因为实数是否为0的判断不能用'==',而取而代之的是判断其是否小于一个很小的数,这里用10^(-6) 
     4 double a[4];//必须是double型的,我刚开始是用float,结果贡献了几个WA 
     5 bool f(int n)
     6 {
     7     if(n==1){//最后处理完毕,即到达解答树叶子节点 
     8         if(fabs(a[0]-24)<Z) return 1;//假如最后结果==24,则返回1 
     9         else return 0;
    10     }
    11     for(int i=0;i<n;++i)//双层循环,用以查找所有的可能情况,即取第i个元素与第j个元素进行运算 
    12         for(int j=i+1;j<n;++j){//从i+1开始,提高查找效率,但这时要注意下面2个操作数的前后顺序,都要考虑,一次过 
    13             double x=a[i];//取第i个元素 
    14             double y=a[j];//取第j个元素 
    15             a[j]=a[n-1];//最后一个元素前移到j,准备下次递归使用,n要-- 
    16             a[i]=x+y;//而x+y作为新的第i个元素 
    17             if(f(n-1)) return 1;//假如碰到一个符合的,即f(n-1)返回1,则不再往下进行,节省时间后面的也是如此 
    18             a[i]=x-y;
    19             if(f(n-1)) return 1;
    20             a[i]=y-x;
    21             if(f(n-1)) return 1;
    22             a[i]=x*y;
    23             if(f(n-1)) return 1;
    24             if(fabs(y)>Z){//必须注意除数不能为0 
    25                 a[i]=x/y;
    26                 if(f(n-1)) return 1;
    27             }
    28             if(fabs(x)>Z){
    29                 a[i]=y/x;
    30                 if(f(n-1)) return 1;
    31             }
    32             a[i]=x;
    33             a[j]=y;
    34         }
    35     return 0;        
    36 }
    37 int main()
    38 {
    39     while(scanf("%lf%lf%lf%lf",&a[0],&a[1],&a[2],&a[3]),(int)a[0]){//a[0]==0时,跳出 
    40         if(f(4)) puts("YES");
    41         else puts("NO");
    42     }
    43     return 0;
    44 }

    //较复杂的递归搜索解答树目标状态!!

  • 相关阅读:
    裸眼 3D 技术是什么原理?
    裸眼3D全攻略3:拍摄3D—瞳距、镜距、视角偏转与空间感
    JFreeChart DateAxis用法
    remount issue on android 7.0
    获取WebView加载的网页内容并进行动态修改
    android自定义Activity窗口大小(theme运用)
    Android5.0免Root截屏,录屏
    coursera上的软件安全课程的课后阅读补充
    java,C#接口与C++的虚基类
    单元测试之C/C++
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2640912.html
Copyright © 2011-2022 走看看