/*------------------------------
【原创】24点游戏程序之三
--更简短、仅30多行代码
-------------------------------*/
#include<stdio.h>
#include <math.h>
int MAX=10;//扑克牌的最大点数10,可改别的数字,如13等
double op(double x,int iop,double y)
{
if(iop==1)return x+y;
if(iop==2)return fabs(x-y); //总让大减小
if(iop==3)return x*y;
if(iop==4)return y?x/y:-9999; //避免零除
else
return x?y/x:-9999; //避免零除
}
int main( void )
{
int p[5],op1,op2,op3,m,noslv=0,S[]={ //24种全排列对应的下标变量
1,2,3,4,1,2,4,3,1,3,2,4,1,3,4,2,1,4,2,3,1,4,3,2, 2,1,3,4,2,1,4,3,2,3,1,4,2,3,4,1,2,4,1,3,2,4,3,1,
3,1,2,4,3,1,4,2,3,2,1,4,3,2,4,1,3,4,1,2,3,4,2,1, 4,1,2,3,4,1,3,2,4,2,1,3,4,2,3,1,4,3,1,2,4,3,2,1};
for(p[1]=
1 ;p[1]<=MAX;p[1]++) //全
for(p[2]=p[1];p[2]<=MAX;p[2]++) //盘
for(p[3]=p[2];p[3]<=MAX;p[3]++) //搜
for(p[4]=p[3];p[4]<=MAX;p[4]++) //索
{
for( m=0; m<4*2*3*4; m+=4 )
//试探4张牌的24种全排列
{
int a=p[S[m+0]],b=p[S[m+1]]; //也可定义为double型
int c=p[S[m+2]],d=p[S[m+3]]; //也可定义为double型
for(op1=1;op1<=4;op1++) //op1: 加减乘除共4种
for(op2=1;op2<=4;op2++) //op2: 加减乘除共4种
for(op3=0;op3<=4;op3++) //op3: 加减乘除还有“反除”共5种
{
if(fabs(op(op(a,op1,b),op3,op(c,op2,d))-24)<1e-8)goto suc;//类似(7-3)*(8-2)
if(fabs(op(op(op(a,op1,b),op2,c),op3,d)-24)<1e-8)goto suc;//类似(10-2)*9/3
}
}
printf("%d,%d,%d,%d: no solution (%d)\n",p[1],p[2],p[3],p[4],++noslv);//打印无效组合及编号
suc: continue; //进入下一个出牌组合
}
getchar(); //避免屏幕一闪而过
return 0;
}
[
本帖最后由 yu_hua 于 2010-11-17 20:04 编辑 ]