【Openjudge】 算24

 

原题戳这里

简单的搜索,深搜轻松A掉,但是出现了许许多多奇奇怪怪恶恶心心的错误

直接简单的模拟,对于a,b两个数,有a+b, a-b, a*b,  a/b, b-a, b/a 四种运算

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath> 
  5 #define p 0.00000001
  6 using namespace std;
  7 double a[5],tot;
  8 bool flag[5],t;
  9 void dfs(int k)
 10 {
 11     if(k==4)
 12     {
 13         for(int y=1;y<=4;y++)    
 14             if(fabs(a[y]-24.0)<=p&&!flag[y])
 15                 t=1;           //一个小小的flag变量
 16         return ;
 17     }
 18     for(int i=1;i<=4;i++)           //任意选出两个数进行加减乘除运算
 19         for(int j=i+1;j<=4;j++)
 20             if(!flag[i]&&!flag[j])
 21             {
 22                 //+
 23                 {
 24                     double f=a[i];
 25                     a[i]=a[i]+a[j];
 26                     tot=a[i];
 27                     flag[j]=true;
 28                     dfs(k+1);
 29                     a[i]=f;
 30                     flag[j]=false;
 31                 }
 32                 //*
 33                 {
 34                     double f=a[i];
 35                     a[i]=a[i]*a[j];
 36                     tot=a[i];
 37                     flag[j]=true;
 38                     dfs(k+1);
 39                     a[i]=f;
 40                     flag[j]=false;
 41                 }
 42                 //-
 43                 {
 44                     double f=a[i];
 45                     a[i]=a[i]-a[j];
 46                     tot=a[i];
 47                     flag[j]=true;
 48                     dfs(k+1);
 49                     a[i]=f;
 50                     flag[j]=false;
 51                 }
 52                 //÷ 
 53                 {
 54                     double f=a[i];
 55                     a[i]=a[i]/a[j];
 56                     tot=a[i];
 57                     flag[j]=true;
 58                     dfs(k+1);
 59                     a[i]=f;
 60                     flag[j]=false;
 61                 }
 62                 //-             ← 倒着减
 63                 {
 64                     double f=a[i];
 65                     a[i]=a[j]-a[i];
 66                     tot=a[i];
 67                     flag[j]=true;
 68                     dfs(k+1);
 69                     a[i]=f;
 70                     flag[j]=false;
 71                 }
 72                 //÷             ←倒着除
 73                 {
 74                     double f=a[i];
 75                     a[i]=a[j]/a[i];
 76                     tot=a[i];
 77                     flag[j]=true;
 78                     dfs(k+1);
 79                     a[i]=f;
 80                     flag[j]=false;
 81                 }
 82             }
 83         return ;
 84 }
 85 int main()
 86 {
 87     while(1)
 88     {
 89         memset(flag,0,sizeof(flag));
 90         cin>>a[1]>>a[2]>>a[3]>>a[4];
 91         if(!a[1]&&!a[2]&&!a[3]&&!a[4])
 92             return 0;
 93         dfs(1);
 94         if(!t)
 95             cout<<"NO"<<endl;
 96         else    cout<<"YES"<<endl;      //防止递归中循环输出YES
 97         t=0;
 98     }
 99     return 0;
100 }

很简单啊哈哈哈哈哈哈

转载于:https://www.cnblogs.com/oiersyp/p/6370155.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值