使用穷举法代码很长,期待学到更好的算法(我想应该用递归吧)
#include <stdio.h>
#include <stdlib.h>#include <math.h>
double add(double x ,double y)
{
return x+y;
}
double mul(double x,double y)
{
return x*y;
}
double sub1(double x,double y)
{
return x-y;
}
double sub2(double x,double y)
{
return y-x;
}
double chu1(double x,double y)
{
return x/y;
}
double chu2(double x,double y)
{
return y/x;
}
double a[4];
typedef double (*ptrFunc)(double,double);
ptrFunc p[6]; //函数指针数组
double resu=0;
bool compute()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(j==i) continue;
for(int k=0;k<6;k++)
{
if(k==4 && a[j]==0) continue;
if(k==5 && a[i]==0) continue;
resu=p[k](a[i],a[j]);//两个数运算的结果
double temp2=resu;
double x,y;
int ii,jj;
for(ii=0;ii<4;ii++)
{
if(ii!=i&&ii!=j) { x = a[ii];break;}
}
for(jj=ii+1;jj<4;jj++)
{
if(jj!=i&&jj!=j) { y = a[jj];break;}
}
double resu2;
for(int q=0;q<6;q++)
{
if(q==4&&y==0) continue;
if(q==5&&x==0) continue;
resu2=p[q](x,y);//另两个数的运算结果
for(int t=0;t<6;t++)
{
if(t==4 && resu2==0) continue;
if(t==5 && temp2==0) continue;
resu=p[t](temp2,resu2);
if(fabs(resu-24.0)<1e-6) return true;
}
}
for(int m=0;m<4;m++)
{
if(m==i||m==j)continue;
for(int q=0;q<6;q++)
{
if(q==4 && a[m]==0) continue;
if(q==5 && temp2==0) continue;
resu=p[q](temp2,a[m]);
double temp=resu;//三个数的运算结果
for(int n=0;n<4;n++)
{
if(n==i||n==j||n==m) continue;
for(int t=0;t<6;t++)
{
if(t==4 && a[n]==0) continue;
if(t==5 && temp==0) continue;
resu=p[t](temp,a[n]); //三个数与另外一个数的运算结果
if(fabs(resu-24.0)<1e-6) return true;
}
}
}
}
}
}
}
return false;
}
int main()
{
p[0]=add;p[1]=mul;p[2]=sub1;p[3]=sub2;p[4]=chu1;p[5]=chu2;
while(1)
{
scanf("%lf%lf%lf%lf",&a[0],&a[1],&a[2],&a[3]);
if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0) break;
if(compute()) printf("YES\n");
else printf("NO\n");
}
return 0;
}