一道比较水的搜索题,就是给你4个数,询问是否可以通过变换位置,加入运算符‘+’,‘-’,‘×’,‘÷’和‘()’得到24
刚开始想复杂了,搞了半天没搞出来,仔细一想,括号的方案数一共就五种(运算符先不加),
1、[(ab)c]d2、[(ab)(cd)]3、[a(bc)]d4、a[(bc)d]5、a[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;
}