zoukankan      html  css  js  c++  java
  • openjudge-NOI 2.5-1789 算24

    题目链接:http://noi.openjudge.cn/ch0205/1789/

    题解:

      并不是非常简单的搜索,需要考虑一些东西……
      首先有运算符优先级的限制,还有括号,数字的顺序也可以调整,如果只是简单给式子添加运算符和括号,会比较难生成,生成后计算或许还要转换成后缀表达式之类的,很麻烦……

      可以将四个数字添加进一个集合(但并不满足互异性),每次从中提取出两个数字分别进行四种计算,将结果放回集合,如此往复直到只剩一个数字,再与24比较即可(注意不一定非要相等,在适当精度内就可以)

      这样也不需要考虑优先级之类的,也可以枚举出所有情况

      曾经想练一下用滚动数组写一下,因为没法解决回溯问题就失败了……

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 using namespace std;
     5 double a[5][5];
     6 bool dfs(int dep)
     7 {
     8     if(dep==4)
     9     {
    10         if(abs(a[dep][1]-24.0)<=0.01)return true;
    11         return false;
    12     }
    13     int n=4-dep+1;
    14     double t1,t2;
    15     for(int i=1;i<=n;++i)
    16     {
    17         for(int j=1;j<=n;++j)
    18         {
    19             if(i==j)continue;
    20             t1=a[dep][i];
    21             a[dep][i]=0;
    22             t2=a[dep][j];
    23             a[dep][j]=0;
    24             int m=1;
    25             for(int l=2;l<=n-1;++l)
    26             {
    27                 while(!a[dep][m])++m;
    28                 a[dep+1][l]=a[dep][m];
    29                 ++m;
    30             }
    31             a[dep+1][1]=t1+t2;
    32             if(dfs(dep+1))return true;
    33             a[dep+1][1]=t1-t2;
    34             if(dfs(dep+1))return true;
    35             a[dep+1][1]=t1*t2;
    36             if(dfs(dep+1))return true;
    37             a[dep+1][1]=t1/t2;
    38             if(dfs(dep+1))return true;
    39             a[dep][i]=t1;
    40             a[dep][j]=t2;
    41         }
    42     }
    43     return false;
    44 }
    45 int main()
    46 {
    47     while(1)
    48     {
    49         memset(a,0,sizeof(a));
    50         scanf("%lf %lf %lf %lf",&a[1][1],&a[1][2],&a[1][3],&a[1][4]);
    51         if(!a[1][1])break;
    52         if(dfs(1))printf("YES
    ");
    53         else printf("NO
    ");
    54     }
    55     return 0;
    56 }
  • 相关阅读:
    用Less循环生成样式
    Angular Textarea 高度自动变化
    html文字溢出以省略号(...)替代
    mobiscroll之treelist使用
    安装Microsoft Visual C++ 2010 x64 Redistributable失败的解决方案
    获取input标签的所有属性
    checked
    js中的in-for循环
    checkbox批量选中,获取选中的项的值
    vue 订单列表 多个倒计时
  • 原文地址:https://www.cnblogs.com/xqmmcqs/p/6004386.html
Copyright © 2011-2022 走看看