24点游戏
一, 题目分析及算法思路
从扑克中每次取出4张牌,使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1)。牌的每张牌表示一个数(J、Q、K分别表示11、12、13,两个司令都表示6)。即得到4个1~13的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4个数顺序可以任意组合,4个运算符任意取3个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出共有0种解法。
本程序使用暴力枚举每次所选的数字和运算符的五种不同运算方式。
五种不同的运算方式如下(括号的五种不同组合):
((a card1 b)card2 c)card3 d
(a card1(b card2 c))card3 d
(a card1 b)card2(c card3 d)
a card1(b card2(c card3 d))
a card1((b card2 c)card3 d)
二, 主要算法
//四则运算符
public static double Card(double x,double y,char n)
{
switch(n)
{
case '+':
return (x+y);
case '-':
{
if(x>y)
return x-y;
else
return y-x;
}
case '*':
return x*y;
case '/':
return x/y;
}
return 0;
}
//计算结果是否等于24并输出
public static int Result(int[] m,char[] n)
{
double y;
int a=m[0];
int b=m[1];
int c=m[2];
int d=m[3];
//枚举法运算次序
//1,((A*B)*C)*D
y=0;
y=Card(a,b,n[0]);
y=Card(c,y,n[1]);
y=Card(d,y,n[2]);
if(y==24)//若计算结果等于24,输出结果
{
System.out.println("("+"("+"("+Number(m[0])+n[0]+Number(m[1])+")"+n[1]+Number(m[2])+")"+n[2]+Number(m[3])+")");
return 1;
}
//2,(A*(B*C))*D
y=0;
y=Card(b,c,n[1]);
y=Card(a,y,n[0]);
y=Card(d,y,n[2]);
if(y==24)
{
System.out.println("("+"("+Number(m[0])+n[0]+"("+Number(m[1])+n[1]+Number(m[2])+")"+")"+n[2]+Number(m[3])+")");
return 1;
}
//3,(A*B)*(C*D)
y=0;
y=Card(Card(a,b,n[0]),Card(c,d,n[2]),n[1]);
if(y==24)
{
System.out.println("("+"("+Number(m[0])+n[0]+Number(m[1])+")"+n[1]+"("+Number(m[2])+n[2]+Number(m[3])+")"+")");
return 1;
}
//4,A*(B*(C*D))
y=0;
y=Card(c,d,n[2]);
y=Card(b,y,n[1]);
y=Card(a,y,n[0]);
if(y==24)
{
System.out.println("("+Number(m[0])+n[0]+"("+Number(m[1])+n[1]+"("+Number(m[2])+n[2]+Number(m[3])+")"+")"+")");
return 1;
}
//5,A*((B*C)*D)
y=0;
y=Card(b,c,n[1]);
y=Card(d,y,n[2]);
y=Card(a,y,n[0]);
if(y==24)
{
System.out.println("("+Number(m[0])+n[0]+"("+"("+Number(m[1])+n[1]+Number(m[2])+")"+n[2]+Number(m[3])+")"+")1");
return 1;
}
return 0;
}
//求出有多少种结果
public static void Many(int[] m)
{
char[] card= {'+','-','*','/'};
char[] n=new char[3];
int i,j,k;
int count=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<4;k++)//三重循环列出所有可能出现的情况
{
n[0]=card[i];
n[1]=card[j];
n[2]=card[k];
if(Result(m,n)==1)
count++;
}
}
}
System.out.println("共有"+count+"种解法");
}
三, 调试,测试及输出结果
-
调试
-
测试结果
(1)随机输出四个数字
(2)有解法时
(3)无解法时
五, 经验总结归纳本次题目我是用Java来进行程序实现的,通过本次代码的编写,使我可以更深入的了解java语言的编程方式,更熟练地去应用它。本次程序设计的比较简单,仅仅是实现了基本要求,可以随机生成四个数(使用了Java中的常用类Random类)使用四则运算来计算24点,但是在过程中也遇到了很多问题,在定义四则运算时,本来是定义了int n,使用switch语句,但是在运行时并不能出现最终结果,程序可以出现四个随机数,说明问题是出在后面的程序中,最后将int n更改为char n,程序才运行成功。在进行编程时,要注意变量类型的定义和使用,一个小错误也可能导致程序的运行失败。