【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