很久前写了一个24点的算法,刚好POJ上也有个24点,顺便给解了,POJ上的相对于我原始来写的较为简单许多,因为,限制了数字的位置固定,实际上24点的话是不可能限制这个固定的,所以我之前会对数据进行一次排列,4个数据,按照位置不同的话就会有24种排列4*3*2*1 ,这个算法因为位置固定,而且只需要求一个解就可以,总体来说简单不少,下面贴代码
#include <iostream> #include <algorithm> using namespace std; int fun3(double a,double b,double c,double d) // a t (b t (c t d)) { int i,j,k; double temp1,temp2,result1,result2; for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) { switch(i) { case 0: temp1=c+d; break; case 1:temp1=c-d; break; case 2:temp1=c*d; break; case 3:temp1=c/d; break; } switch(j) { case 0: temp2=b+temp1; break; case 1:temp2=b-temp1; break; case 2:temp2=b*temp1; break; case 3:temp2=b/temp1; break; } switch(k) { case 0: result1=a+temp2; break; case 1:result1=a-temp2; break; case 2:result1=a*temp2; break; case 3:result1=a/temp2; break; } result2= (result1); if( (result2-24)>-0.00001&& (result2-24)<0.00001) { char e,f,g; switch(i) { case 0:e='+'; break; case 1:e='-'; break; case 2:e='*'; break; case 3:e='/'; break; } switch(j) { case 0:f='+'; break; case 1:f='-'; break; case 2:f='*'; break; case 3:f='/'; break; } switch(k) { case 0 : g='+'; break; case 1:g='-'; break; case 2:g='*'; break; case 3:g='/'; break; } cout<<a<<g<<"("<<b<<f<<"("<<c<<e<<d<<")"<<")"<<endl; return 1; } } return 0; } int fun22(double a,double b,double c,double d) //a t ((b t c) t d) { int i,j,k; double temp1,temp2,result1,result2; for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) { switch(i) { case 0: temp1=b+c; break; case 1:temp1=b-c; break; case 2:temp1=b*c; break; case 3:temp1=b/c; break; } switch(j) { case 0: temp2=temp1+d; break; case 1:temp2=temp1-d; break; case 2:temp2=temp1*d; break; case 3:temp2=temp1/d; break; } switch(k) { case 0: result1=a+temp2; break; case 1:result1=a-temp2; break; case 2:result1=a*temp2; break; case 3:result1=a/temp2; break; } result2= (result1); if( (result2-24)>-0.00001&& (result2-24)<0.00001) { char e,f,g; switch(i) { case 0:e='+'; break; case 1:e='-'; break; case 2:e='*'; break; case 3:e='/'; break; } switch(j) { case 0:f='+'; break; case 1:f='-'; break; case 2:f='*'; break; case 3:f='/'; break; } switch(k) { case 0 : g='+'; break; case 1:g='-'; break; case 2:g='*'; break; case 3:g='/'; break; } cout<<a<<g<<"("<<"("<<b<<e<<c<<")"<<f<<d<<")"<<endl; return 1; } } return 0; } int fun2(double a,double b,double c,double d) //(a t (b t c)) t d { int i,j,k; double temp1,temp2,result1,result2; for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) { switch(i) { case 0: temp1=b+c; break; case 1:temp1=b-c; break; case 2:temp1=b*c; break; case 3:temp1=b/c; break; } switch(j) { case 0: temp2=a+temp1; break; case 1:temp2=a-temp1; break; case 2:temp2=a*temp1; break; case 3:temp2=a/temp1; break; } switch(k) { case 0: result1=temp2+d; break; case 1:result1=temp2-d; break; case 2:result1=temp2*d; break; case 3:result1=temp2/d; break; } result2= (result1); if( (result2-24)>-0.00001&& (result2-24)<0.00001) { char e,f,g; switch(i) { case 0:e='+'; break; case 1:e='-'; break; case 2:e='*'; break; case 3:e='/'; break; } switch(j) { case 0:f='+'; break; case 1:f='-'; break; case 2:f='*'; break; case 3:f='/'; break; } switch(k) { case 0 : g='+'; break; case 1:g='-'; break; case 2:g='*'; break; case 3:g='/'; break; } cout<<"("<<a<<f<<"("<<b<<e<<c<<")"<<")"<<g<<d<<endl; return 1; } } return 0; } int fun1(double a,double b,double c,double d) //(a t b)t(c t d) { int i,j,k; double temp1,temp2,result1,result2; for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) { switch(i) { case 0: temp1=a+b; break; case 1:temp1=a-b; break; case 2:temp1=a*b; break; case 3:temp1=a/b; break; } switch(j) { case 0: temp2=c+d; break; case 1:temp2=c-d; break; case 2:temp2=c*d; break; case 3:temp2=c/d; break; } switch(k) { case 0: result1=temp1+temp2; break; case 1:result1=temp1-temp2; break; case 2:result1=temp1*temp2; break; case 3:result1=temp1/temp2; break; } result2= (result1); if( (result2-24)>-0.00001&& (result2-24)<0.00001) { char e,f,g; switch(i) { case 0:e='+'; break; case 1:e='-'; break; case 2:e='*'; break; case 3:e='/'; break; } switch(j) { case 0:f='+'; break; case 1:f='-'; break; case 2:f='*'; break; case 3:f='/'; break; } switch(k) { case 0 : g='+'; break; case 1:g='-'; break; case 2:g='*'; break; case 3:g='/'; break; } cout<<"("<<a<<e<<b<<")"<<g<<"("<<c<<f<<d<<")"<<endl; return 1; } } return 0; } int fun(double a,double b,double c,double d) //((a t b) t c) t d { int i,j,k; double temp1,temp2,result1,result2; for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) { switch(i) { case 0: temp1=a+b; break; case 1:temp1=a-b; break; case 2:temp1=a*b; break; case 3:temp1=a/b; break; } switch(j) { case 0: temp2=temp1+c; break; case 1:temp2=temp1-c; break; case 2:temp2=temp1*c; break; case 3:temp2=temp1/c; break; } switch(k) { case 0: result1=temp2+d; break; case 1:result1=temp2-d; break; case 2:result1=temp2*d; break; case 3:result1=temp2/d; break; } result2= (result1); if( (result2-24)>-0.00001&& (result2-24)<0.00001) { char e,f,g; switch(i) { case 0:e='+'; break; case 1:e='-'; break; case 2:e='*'; break; case 3:e='/'; break; } switch(j) { case 0:f='+'; break; case 1:f='-'; break; case 2:f='*'; break; case 3:f='/'; break; } switch(k) { case 0 : g='+'; break; case 1:g='-'; break; case 2:g='*'; break; case 3:g='/'; break; } cout<<"("<<"("<<a<<e<<b<<")"<<f<<c<<")"<<g<<d<<endl; return 1; } } return 0; } int can24(int a,int b,int c,int d) { int res=0; res= fun(a,b,c,d); if(res==1)return res; res= fun1(a,b,c,d); if(res==1)return res; res= fun2(a,b,c,d); if(res==1)return res; res= fun22(a,b,c,d); if(res==1)return res; res= fun3(a,b,c,d); if(res==1)return res; return res; } int main(int argc, char* args[]) { int a,b,c,d; cin>>a>>b>>c>>d; int res=can24(a,b,c,d); return 0; };
比较笨,只会用穷举 。根据计算优先级 会有以下5种 t表示符号
((a t b)t c) t d (a t b) t (c t d) a t ((b t c) t d) (a t (b t c)) t d a t ((b t c) t d) 每种都写了一个函数