HNU 12886 Cracking the Safe(暴力枚举)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12886&courseid=274

解题报告:输入4个数,要你判断用 + 、- 、 * 、/、四种运算能不能得到一个结果为24的式子,可以用括号。

解释一下测试的第四组样例:应该是6 / (1 - 3 / 4)

暴力枚举三种符号分别是什么,然后枚举这三种符号运算的顺序,然后枚举这四个数字的24种排列方式,时间是4^3 * 6 * 24

然后注意要用double型,判断是否等于24的时候要这样fabs(ans - 24.0) <= 0.000000001

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<map>
 6 #include<string>
 7 #include<cmath>
 8 using namespace std;
 9 int fu[4];
10 int mei[50][5] = {
11 {1 ,2 ,3 ,4},
12 {1 ,2 ,4 ,3},
13 {1 ,3 ,2 ,4},
14 {1 ,3 ,4 ,2},
15 {1 ,4 ,2 ,3},
16 {1 ,4 ,3 ,2},
17 {2 ,1 ,3 ,4},
18 {2 ,1 ,4 ,3},
19 {2 ,3 ,1 ,4},
20 {2 ,3 ,4 ,1},
21 {2 ,4 ,1 ,3},
22 {2 ,4 ,3 ,1},
23 {3 ,1 ,2 ,4},
24 {3 ,1 ,4 ,2},
25 {3 ,2 ,1 ,4},
26 {3 ,2 ,4 ,1},
27 {3 ,4 ,1 ,2},
28 {3 ,4 ,2 ,1},
29 {4 ,1 ,2 ,3},
30 {4 ,1 ,3 ,2},
31 {4 ,2 ,1 ,3},
32 {4 ,2 ,3 ,1},
33 {4 ,3 ,1 ,2},
34 {4 ,3 ,2 ,1},
35 };
36 double CC(int f,double a,double b)
37 {
38     if(f == 4 && b == 0) return 0;
39     if(f == 1) return a + b;
40     if(f == 2) return a - b;
41     if(f == 3) return a * b;
42     if(f == 4) return a / b;
43 }
44 double calc(int l,double a,double b,double c,double d)
45 {
46 //    double a = num[1],b = num[2],c = num[3],d = num[4];
47     if(l == 1)
48     return CC(fu[3],CC(fu[2],CC(fu[1],a,b),c),d);
49     if(l == 2)
50     return CC(fu[2],CC(fu[1],a,b),CC(fu[3],c,d));
51     if(l == 3)
52     return CC(fu[3],CC(fu[1],a,CC(fu[2],b,c)),d);
53     if(l == 4)
54     return CC(fu[1],a,CC(fu[3],CC(fu[2],b,c),d));
55     if(l == 5)
56     return CC(fu[2],CC(fu[1],a,b),CC(fu[3],c,d));
57     if(l == 6)
58     return CC(fu[1],a,CC(fu[2],b,CC(fu[3],c,d)));
59 }
60 int main()
61 {
62     
63     int T;
64     scanf("%d",&T);
65     while(T--)
66     {
67         double num[5];
68         scanf("%lf%lf%lf%lf",&num[1],&num[2],&num[3],&num[4]);
69         int flag = 1;
70         for(int i = 1;flag && i <= 4;++i)
71         for(int j = 1;flag && j <= 4;++j)
72         for(int k = 1;flag && k <= 4;++k)
73         {
74             fu[1] = i;
75             fu[2] = j;
76             fu[3] = k;
77             for(int m = 0;flag && m < 24;++m)
78             {
79                 for(int l = 1;flag && l <= 6;++l)
80                 {
81                     double ans = calc(l,num[mei[m][0]],num[mei[m][1]],num[mei[m][2]],num[mei[m][3]]);
82                     if(fabs(ans-24.0) <= 0.00000001)
83                     {
84                         flag = 0;
85                         break;
86                     }
87                 }
88             }
89         }
90         printf(flag? "NO\n":"YES\n");
91     }
92     return 0;
93 }
View Code

 

转载于:https://www.cnblogs.com/xiaxiaosheng/p/3903416.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值