//
24点游戏程序(迄今最令俺满意的一个)
#define MAXP 13 //也可定义为10或其它正整数
#include<stdio.h>
#define DO(I,a1,a2, J,m1,m2, K,z1,z2) for(K=z1;K<=z2;K++)for(J=m1;J<=m2;J++)for(I=a1;I<=a2;I++)
#define fmt0
"%d%c%d%c%d%c%d=24\n"
#define fmt2 "(%d%c%d)%c%d%c%d=24\n"
#define fmt3 "(%d%c%d%c%d)%c%d=24\n"
char os[]="@+-*/";
int
way,op1,op2,op3;
void s04(int,int,int,int);
void s05(int,int,int,int);
void s06(int,int,int,int);
void s08(int,int,int,int);
//-- 定义四则运算 --
int op(int x,int iop,int y)
{
int ret=-9999;
switch(iop)
{
default: break;
case 1 : ret= x+y; break;
case 2 : ret= x-y; break;
case 3 : ret= x*y; break;
case 4 : if(y>1 && x%y==0)ret=x/y;
}
return ret;
}
//-- 计数与显示 --
void print2(char *format,int a,char o1,int b,char o2,int c,char o3,int d)
{
if(++way==1)printf("\n");
printf(format,a,o1,b,o2,c,o3,d);
}
//-- “一式六份” --
void use(void(*fun)(),int a,int b,int c,int d)
{
(*fun)(a,b,c,d);if(a-c||b-d)(*fun)(c,d,a,b);
if(a-b && c-d){(*fun)(a,d,b,c);(*fun)(b,c,a,d);}
if(b-c){(*fun)(a,c,b,d);if(a-b||c-d)(*fun)(b,d,a,c);}
}
//-- 运算模式系列 --
void m02(int a,int b,int c, int d)
{
DO( op3,1,2, op2,1,2, op1,1,2 )
if(op(op(op(op(0,op1,a),op2,b),op3,c),3,d)==24)
{
op1==2? print2(fmt3,b,os[op3],c,os[op1],a,os[3],d):
print2(fmt3,a,os[op2],b,os[op3],c,os[3],d);
return;
}
}
void m03(int a,int b,int c,int d)
{
int t1,t2;
DO( op3,0,0, op2,1,2, op1,3,4 )
if(op(t1=op(a,3,b),op2,t2=op(c,op1,d))==24 && !(d*b==1) && t1>=t2)
{
if(a*b==24/2 && a<c)continue;
print2(fmt0,a,os[3],b,os[op2],c,os[op1],d);
}
DO( op3,0,0, op2,1,2, op1,1,2 )
{
if(op(t1=op(a,op1,b),3,t2=op(c,op2,d))==24 && t1>=t2)
print2("(%d%c%d)%c(%d%c%d)=24\n",a,os[op1],b,os[3],c,os[op2],d);
if(op(op(a,op1,b),op2,op(c,4,d))==24)
print2(fmt0,a,os[op1],b,os[op2],c,os[4],d);
}
for(op2=1; op2<=2; op2++)
if(op(op(a,3,b),4,op(c,op2,d))==24)
print2("%d%c%d%c(%d%c%d)=24\n",a,os[3],b,os[4],c,os[op2],d);
}
void m04(int a,int b,int c,int d){s04(a,b,c,d);if(c-d)s04(a,b,d,c);}
void m05(int a,int b,int c,int d){s05(a,b,c,d);if(c-d)s05(a,b,d,c);}
void m06(int a,int b,int c,int d){s06(a,b,c,d);if(c-d)s06(a,b,d,c);}
void m07(int a,int b,int c,int d)
{
DO( op3,0,0, op2,1,2, op1,1,2 )
if( op(op(op(a,3,b),op1,c),op2,d)==24 && b>1 && !(c==d && op1>op2))
print2(fmt0,a,os[3],b,os[op1],c,os[op2],d);
DO( op3,0,0, op2,1,2, op1,3,4 )
{
if(op(op(op(a,3,b),op1,c),op2,d)==24 && c>1 && !(op1==3 && b<c))
print2(fmt0,a,os[3],b,os[op1],c,os[op2],d);
if(c==d)continue;
if(op(op(op(a,3,b),op1,d),op2,c)==24 && d>1 && !(op1==3 && b<d))
print2(fmt0,a,os[3],b,os[op1],d,os[op2],c);
}
}
void m08(int a,int b,int c,int d)
{
s08(a,b,c,d);if(c-d)s08(a,b,d,c);
if(a-b){s08(b,a,c,d);if(c-d)s08(b,a,d,c);}
}
//-- 子程序系列 --
void s04(int a,int b,int c,int d)
{
DO(op1,0,0, op2,1,2, op3,3,4)
{
int ans=op(op(a*b,op2,c),op3,d);
if(ans*ans==24*24 && d>1 && b>1)
ans==24? print2(fmt3,a,os[3],b,os[op2],c,os[op3],d):
print2(fmt3,c,os[op2],a,os[3],b,os[op3],d);
}
}
void s05(int a,int b,int c,int d)
{
DO( op3,1,2, op2,0,0, op1,1,2 )
if(op(op(a,op1,b)*c,op3,d)==24 && c>1)
print2(fmt2,a,os[op1],b,os[3],c,os[op3],d);
DO( op3,3,4, op2,0,0, op1,1,2 )
if(op(op(a,op1,b)*c,op3,d)==24 && (op3>3||c>=d))
print2(fmt2,a,os[op1],b,os[3],c,os[op3],d);
}
void s06(int a,int b,int c,int d)
{
DO( op3,1,2, op2,0,0, op1,1,2 )
if(op(op(op(a,op1,b),4,c),op3,d)==24)
print2(fmt2,a,os[op1],b,os[4],c,os[op3],d);
}
void s08(int a,int b,int c,int d)
{
if((a+b*c)*d==24*b && b>1)
print2(fmt3,a,os[4],b,os[1],c,os[3],d);
if((a-b*c)*d==24*b && b>1)
print2(fmt3,a,os[4],b,os[2],c,os[3],d);
if((b*c-a)*d==24*b && b>1)
print2(fmt3,c,os[2],a,os[4],b,os[3],d);
if(d*b==(c*b-a)*24)
print2("%d%c(%d%c%d%c%d)=24\n",d,os[4],c,os[2],a,os[4],b);
if(d*b==(a-c*b)*24)
print2("%d%c(%d%c%d%c%d)=24\n",d,os[4],a,os[4],b,os[2],c);
}
//----------------------------------------------------------------
int main( void )
{
int d,c, b,a,noslv=0;
for(d=1; d<=MAXP; d++)
for(c=d; c<=MAXP; c++)
for(b=c; b<=MAXP; b++)
for(a=b; a<=MAXP; a++)
//printf("请从小到大输入4张牌: ");///////////
//scanf("%d%*c%d%*c%d%*c%d",&d,&c,&b,&a);////
{
way=0;
printf("%d,%d,%d,%d: ",d,c,b,a);
if(op(a+b+c,1,d)==24)print2(fmt0,a,os[1],b,os[1],c,os[1],d);else
if(op(a+b+c,2,d)==24)print2(fmt0,a,os[1],b,os[1],c,os[2],d);else
if(op(a+b+d,2,c)==24)print2(fmt0,a,os[1],b,os[1],d,os[2],c);else
if(op(a+c+d,2,b)==24)print2(fmt0,a,os[1],c,os[1],d,os[2],b);else
if(op(b+c+d,2,a)==24)print2(fmt0,b,os[1],c,os[1],d,os[2],a);else
if(op(a+b,2,c+d)==24)print2(fmt0,a,os[1],b,os[2],c,os[2],d);
if(op(a*b*c,3,d)==24)print2(fmt0,a,os[3],b,os[3],c,os[3],d);else
if(op(a*b*c,4,d)==24)print2(fmt0,a,os[3],b,os[3],c,os[4],d);else
if(op(a*b*d,4,c)==24)print2(fmt0,a,os[3],b,os[4],c,os[3],d);else
if(op(a*c*d,4,b)==24)print2(fmt0,a,os[4],b,os[3],c,os[3],d);else
if(op(b*c*d,4,a)==24)print2(fmt0,b,os[3],c,os[3],d,os[4],a);else
if(op(a*b,4,c*d)==24)print2(fmt0,a,os[3],b,os[4],c,os[4],d);
m02(a,b,c,d);if(c-d)m02(a,b,d,c);if(b-c)m02(a,c,d,b);if(a-b)m02(b,c,d,a);
use(m03, a,b,c,d);
use(m04, a,b,c,d);
use(m05, a,b,c,d);
use(m06, a,b,c,d);
use(m07, a,b,c,d);
use(m08, a,b,c,d);
if(!way) printf("failure(%d)\n",++noslv);
}
return(0);
}