24点游戏设计
问题描述:在数字1-13中随机生成4个数字,运用加减乘除四则使4个数字的运行结果为24,每个数字仅能使用一次。
算法设计:实现24点运算有如下两种算法。
算法一穷举法。所谓穷举法就是列出4个数字加减乘除的各种可能性。我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。再进行符号的排列表达式,其中算术符号有+,—,*,/,(,)。其中有效的表达式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表达式。其中我们用枚举类型将符号定义成数字常量。
算法二是把多元运算转化为两元运算,先从四个数中取出两个数进行运算,然后把运算结果和第三个数进行运算,再把结果与第四个数进行运算。在求表达式的过程中,最难处理的就是对括号的处理,而这种思路很好的避免了对括号的处理。
核心代码如下:
float Compute(char* str)
{
int i=0;
float x;
CharPush(m,';'); //初始化字符栈,中只有一个元素';',整数栈为空栈
while(str[i]&&i<SIZE-1) //处理中缀表达式循环
{
x=0;
if(str[i]==' ')
{
i++;
continue;
}
while(str[i]>=48&&str[i]<=57) //1到10的ASCII码值
{
x=x*10+str[i]-48; //从屏幕上获取的都是以字符的形式展现出来的,所以要ASCILL码值都要减去48 ,这样才能输入多位数
i++;
}
if(x!=0) ValuePush(n,x); //如果x的值不等于 0那么就进整数栈
else
{
int a=Prior2(str[i]); //处理栈外字符
int b=Prior(*(m.top-1)); //处理栈内字符,成员变量是字符栈中的栈顶元素
if(a>b) //栈外运算符优先级高于栈内运算符优先级
{
CharPush(m,str[i]);i++;} //将其插入到字符栈中
else
switch(CharPop(m)) //优先级相反,括号里面的参数变量是字符栈内的首元素
{
case '+':x=ValuePop(n)+ValuePop(n); //从整数栈中抛出两个数值,进行以上的运算
ValuePush(n,x); break;
case '-':x=ValuePop(n);
x=ValuePop(n)-x;
ValuePush(n,x);break;
case '*':x=ValuePop(n)*ValuePop(n);
ValuePush(n,x);break;
case '/':x=ValuePop(n);
if(x!=0.0)
{
x=ValuePop(n)/x;
ValuePush(n,x);
}
else {cout<<"零不能做除数"<<endl;i=SIZE-1;}
break;
case '(':i++;break;
case ';':i=SIZE-1;break;
default:cout<<"====输入有误===="<<endl;
}
}
}
x=ValuePop(n);
return x;
}