Hihocode 1304

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\n");
94         else
95             printf("No\n");
96     }
97     return 0;
98 }

 

posted @ 2017-05-25 16:35  一个_小菜鸟  阅读(367)  评论(0编辑  收藏  举报