【Noi OpenJudge】 算24 解题报告

一道比较水的搜索题,就是给你4个数,询问是否可以通过变换位置,加入运算符‘+’,‘-’,‘×’,‘÷’和‘()’得到24

刚开始想复杂了,搞了半天没搞出来,仔细一想,括号的方案数一共就五种(运算符先不加),

1[(ab)c]d2[(ab)(cd)]3[a(bc)]d4a[(bc)d]5a[b(cd)]

先枚举a,b,c,d这4个数之间的运算符,然后在枚举括号的方案数就行了

代码如下

/*My convictions will not falter.*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
float a[5],b[5];
int f[4];
bool pd;
void read(int &x)
{
    x=0;char c=getchar();
    while(c<48||c>57) c=getchar();
    while(c>=48&&c<=57) x=x*10+c-48,c=getchar();
    return ;
}
float rt(float a,int t,float b)
{
    if(t==1) return a+b;
    if(t==2) return a-b;
    if(t==3) return a*b;
    if(t==4&&b!=0) return a/b;
    else return 3.1415926;//防止被零除随便返回个值就行了
}
float abbs(float x)
{
    return x>0? x:-x;
}
void work()
{
    if(abbs(rt(rt(a[1],f[1],a[2]),f[2],rt(a[3],f[3],a[4]))-24.0)<0.01) pd=1;
    else if(abbs(rt(rt(rt(a[1],f[1],a[2]),f[2],a[3]),f[3],a[4])-24.0)<0.01)pd=1;
    else if(abbs(rt(rt(a[1],f[1],rt(a[2],f[2],a[3])),f[3],a[4])-24.0)<0.01) pd=1;
    else if(abbs(rt(a[1],f[1],rt(rt(a[2],f[2],a[3]),f[3],a[4]))-24.0)<0.01) pd=1;
    else if(abbs(rt(a[1],f[1],rt(a[2],f[2],rt(a[3],f[3],a[4])))-24.0)<0.01) pd=1;
    return ;
}
void dfs(int t)
{
    if(t==4) {work();return ;}
    for(int i=1;i<5;i++)
      if(!pd) f[t]=i,dfs(t+1);
      else return ;
}
int main()
{
    while(1)
    {
    for(int i=1;i<=4;i++)
    scanf("%f",&b[i]);
    if(b[1]==0&&b[2]==0&&b[3]==0&&b[4]==0)
    break;
    pd=0;
    for(int ia=1;ia<=4;ia++) 
      for(int ib=1;ib<=4;ib++) if(ia!=ib) 
        for(int ic=1;ic<=4;ic++) if(ic!=ib&&ic!=ia)
          for(int id=1;id<=4;id++) if(id!=ia&&id!=ib&&id!=ic)
            {
            a[1]=b[ia],a[2]=b[ib],a[3]=b[ic],a[4]=b[id];
            dfs(1);
            }
    if(pd) printf("YES\n");
    else printf("NO\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值