HNU 12886 Cracking the Safe(暴力枚举)
2014-08-10 21:24
375 查看
题目链接: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
View Code
解题报告:输入4个数,要你判断用 + 、- 、 * 、/、四种运算能不能得到一个结果为24的式子,可以用括号。
解释一下测试的第四组样例:应该是6 / (1 - 3 / 4)
暴力枚举三种符号分别是什么,然后枚举这三种符号运算的顺序,然后枚举这四个数字的24种排列方式,时间是4^3 * 6 * 24
然后注意要用double型,判断是否等于24的时候要这样fabs(ans - 24.0) <= 0.000000001
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<map> #include<string> #include<cmath> using namespace std; int fu[4]; int mei[50][5] = { {1 ,2 ,3 ,4}, {1 ,2 ,4 ,3}, {1 ,3 ,2 ,4}, {1 ,3 ,4 ,2}, {1 ,4 ,2 ,3}, {1 ,4 ,3 ,2}, {2 ,1 ,3 ,4}, {2 ,1 ,4 ,3}, {2 ,3 ,1 ,4}, {2 ,3 ,4 ,1}, {2 ,4 ,1 ,3}, {2 ,4 ,3 ,1}, {3 ,1 ,2 ,4}, {3 ,1 ,4 ,2}, {3 ,2 ,1 ,4}, {3 ,2 ,4 ,1}, {3 ,4 ,1 ,2}, {3 ,4 ,2 ,1}, {4 ,1 ,2 ,3}, {4 ,1 ,3 ,2}, {4 ,2 ,1 ,3}, {4 ,2 ,3 ,1}, {4 ,3 ,1 ,2}, {4 ,3 ,2 ,1}, }; double CC(int f,double a,double b) { if(f == 4 && b == 0) return 0; if(f == 1) return a + b; if(f == 2) return a - b; if(f == 3) return a * b; if(f == 4) return a / b; } double calc(int l,double a,double b,double c,double d) { // double a = num[1],b = num[2],c = num[3],d = num[4]; if(l == 1) return CC(fu[3],CC(fu[2],CC(fu[1],a,b),c),d); if(l == 2) return CC(fu[2],CC(fu[1],a,b),CC(fu[3],c,d)); if(l == 3) return CC(fu[3],CC(fu[1],a,CC(fu[2],b,c)),d); if(l == 4) return CC(fu[1],a,CC(fu[3],CC(fu[2],b,c),d)); if(l == 5) return CC(fu[2],CC(fu[1],a,b),CC(fu[3],c,d)); if(l == 6) return CC(fu[1],a,CC(fu[2],b,CC(fu[3],c,d))); } int main() { int T; scanf("%d",&T); while(T--) { double num[5]; scanf("%lf%lf%lf%lf",&num[1],&num[2],&num[3],&num[4]); int flag = 1; for(int i = 1;flag && i <= 4;++i) for(int j = 1;flag && j <= 4;++j) for(int k = 1;flag && k <= 4;++k) { fu[1] = i; fu[2] = j; fu[3] = k; for(int m = 0;flag && m < 24;++m) { for(int l = 1;flag && l <= 6;++l) { double ans = calc(l,num[mei[m][0]],num[mei[m][1]],num[mei[m][2]],num[mei[m][3]]); if(fabs(ans-24.0) <= 0.00000001) { flag = 0; break; } } } } printf(flag? "NO\n":"YES\n"); } return 0; }
View Code
相关文章推荐
- 暴力枚举 + 24点 --- hnu : Cracking the Safe
- hnu 12886 Cracking the Safe
- 暴力枚举 + 24点 --- hnu : Cracking the Safe
- How Many Maos Does the Guanxi Worth (暴力枚举+Dijkstra)
- hdoj 1598 find the most comfortable road【并查集&&暴力枚举】
- HDU 4930 Fighting the Landlords(暴力枚举+模拟)
- B - The Large Family+暴力枚举
- [LeetCode] Cracking the Safe 破解密码
- hdoj 1598 find the most comfortable road 【并查集】+【暴力枚举】
- UVA 105 - The Skyline Problem(暴力枚举)
- The Useless Toy(水题 暴力枚举)
- HDU-1598-find the most comfortable road(暴力枚举+Kruskal最小生成树)
- hdu 1081 To The Max(暴力枚举+最大连续子数组和)
- codeforces 487 A Fight the Monster 暴力枚举
- The broken pedometer-纯暴力枚举
- 753-Cracking the Safe
- HDU 4930 Fighting the Landlords(暴力枚举+模拟)
- 暴力枚举——Help Me with the Game
- HDU 4151 The Special Number【二分+暴力枚举】
- poj 1054 The Troublesome Frog 排序后暴力枚举,剪枝优化