24点游戏
一、题目分析
随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
二、算法构造
三、算法实现
#include<stdio.h>
char op[5]={'#','+','-','*','/',};
float cal(float x,float y,int op)
{
switch(op)
{
case 1:return x+y;
case 2:return x-y;
case 3: return x*y;
case 4: return x/y;
}
}
float calculate_model1(float i,float j,float k,float t,int op1,int op2,int op3)
{
float r1,r2,r3;
r1 = cal(i,j,op1);
r2 = cal(r1,k,op2);
r3 = cal(r2,t,op3);
return r3;
}
float calculate_model2(float i,float j,float k,float t,int op1,int op2,int op3)
{
float r1,r2,r3;
r1 = cal(j,k,op2);
r2 = cal(i,r1,op1);
r3 = cal(r2,t,op3);
return r3;
}
float calculate_model3(float i,float j,float k,float t,int op1,int op2,int op3)
{
float r1,r2,r3 ;
r1 = cal(k,t,op3);
r2 = cal(j,r1,op2);
r3 = cal(i,r2,op1);
return r3;
}
float calculate_model4(float i,float j,float k,float t,int op1,int op2,int op3)
{
float r1,r2,r3;
r1 = cal(j,k,op2);
r2 = cal(r1,t,op3);
r3 = cal(i,r2,op1);
return r3;
}
float calculate_model5(float i,float j,float k,float t,int op1,int op2,int op3)
{
float r1,r2,r3 ;
r1 = cal(i,j,op1);
r2 = cal(k,t,op3);
r3 = cal(r1,r2,op2);
return r3;
}
get24(int i,int j,int k,int t)
{
int op1,op2,op3;
int flag=0;
for(op1=1;op1<=4;op1++)
for(op2=1;op2<=4;op2++)
for(op3=1;op3<=4;op3++)
{
if(calculate_model1(i,j,k,t,op1,op2,op3)==24)
{
printf("((%d%c%d)%c%d)%c%d=24\n",i,op[op1],j,op[op2],k,op[op3],t);
flag = 1;
}
if(calculate_model2(i,j,k,t,op1,op2,op3)==24)
{
printf("(%d%c(%d%c%d))%c%d=24\n",i,op[op1],j,op[op2],k,op[op3],t);
flag = 1;
}
if(calculate_model3(i,j,k,t,op1,op2,op3)==24)
{
printf("%d%c(%d%c(%d%c%d))=24\n",i,op[op1],j,op[op2],k,op[op3],t);
flag = 1;
}
if(calculate_model4(i,j,k,t,op1,op2,op3)==24)
{
printf("%d%c((%d%c%d)%c%d)=24\n",i,op[op1],j,op[op2],k,op[op3],t);
flag = 1;
}
if(calculate_model5(i,j,k,t,op1,op2,op3)==24)
{
printf("(%d%c%d)%c(%d%c%d)=24\n",i,op[op1],j,op[op2],k,op[op3],t);
flag = 1;
}
}
return flag;
}
main()
{
int i,j,k,t,a[4];
srand((unsigned)time(NULL)); //随机种子
printf("四个数是:\n");
for(i=0;i<4;i++)
{
a[i]=rand()%12+1; //获得随机数
if(a[i]==1)
{
a[i]='A';
}
if(a[i]==11)
{
a[i]='J';
}
if(a[i]==12)
{
a[i]='Q';
}
if(a[i]==13)
{
a[i]='K';
}
printf("%4d\n",a[i]);
}
i=a[0];
j=a[1];
k=a[2];
t=a[3];
printf("可以得到结果24的计算方法:\n");
get24(i,j,k,t);
}
四、运行结果
(1)无法得出24时
(2)可以得出24时
五、经验归纳
刚看到这个问题时,感觉是自己一点思路都没有,知道24如何去算问题想的清楚,但对于算法感到棘手无从下手,是在网上查阅了相关资料,看了看前人所写的代码,对于整体框架有了大致把握才开始写,但中途有部分算法还是参照别人的写的,感觉自己有点失败,感觉自己还是应该多多加强算法练习。