您的位置:首页 > Web前端

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

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: