http://hihocoder.com/problemset/problem/1304
题意:就是四个数字加上运算符,看看是否可以构成二十四点。
思路:这个题目肯定是个DFS
搜索是这么搜的,首先有4个数字,排列的话那么就会有4!=24中组合,然后运算符,在运算符号这里,我们进行拓展,也就是由4个运算符拓展成六个运算符,+,-,*,/,~-,~/。
这里的~-意思就是减数和被减数互换一下,~/一样的意思。这样的话,那么我们只有两种组合
(((a ⊙ b) ⊙ c ) ⊙ d)
((a ⊙ b) ⊙ (c ⊙ d))
之后我们进行枚举就可以。
代码有点长,不过看别人的,确实有更加好的办法,这个还是算比较笨的吧。
1 //最初的梦想,紧握手上 2 3 4 #include <stdio.h> 5 #include <string.h> 6 #include <math.h> 7 #define eps 1e-5 8 bool used[4]; 9 int num[4]; 10 int nownum[4]; 11 int ope[3]; 12 double judge(double a,double b,int x) //运算符 13 { 14 switch (x) 15 { 16 case 1: 17 return a+b; 18 case 2: 19 return a-b; 20 case 3: 21 return a*b; 22 case 4: 23 if(fabs(b-0)>eps) 24 return a/b; 25 else 26 return -999999; 27 case 5: 28 return b-a; 29 case 6: 30 if(fabs(a-0)>eps) 31 return b/a; 32 else return -999999; 33 } 34 35 } 36 double jud1() //第一种判断 37 { 38 return judge(judge(judge(nownum[0],nownum[1],ope[0]),nownum[2],ope[1]),nownum[3],ope[2]); 39 40 } 41 42 double jud2() //第二种判断 43 { 44 return judge(judge(nownum[0],nownum[1],ope[0]),judge(nownum[2],nownum[3],ope[1]),ope[2]); 45 } 46 bool calc(int deep) //枚举运算符 47 { 48 if(deep>2) 49 { 50 if(fabs(jud1()-24)<eps) 51 return true; 52 if(fabs(jud2()-24)<eps) 53 return true; 54 return false; 55 } 56 for(int i =1; i<=6; i++) 57 { 58 ope[deep] = i; 59 if(calc(deep+1)) 60 return true; 61 } 62 return false; 63 } 64 65 bool dfs(int deep) //枚举数字 66 { 67 if(deep>3) 68 return calc(0); 69 for(int i = 0; i<4; i++) 70 if(used[i]) 71 { 72 used[i] = false; 73 nownum[deep] = num[i]; 74 if(dfs(deep+1)) 75 return true; 76 used[i] = true; 77 } 78 return false; 79 } 80 81 82 int main() 83 { 84 // freopen("in.txt","r",stdin); 85 int a,b,c,d; 86 int t; 87 scanf("%d",&t); 88 while(t--) 89 { 90 memset(used,true,sizeof(used)); 91 scanf("%d%d%d%d",&num[0],&num[1],&num[2],&num[3]); 92 if(dfs(0)) 93 printf("Yes "); 94 else 95 printf("No "); 96 } 97 return 0; 98 }