简单的搜索,深搜轻松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 }
很简单啊哈哈哈哈哈哈