VC380 24点游戏的算法设计论文
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
1.2 24点游戏的算法
1.2.1 24点算法(1)
24点游戏的算法,其中最主要的思想就是穷举法。所谓穷举法就是列出4个数字加减乘除的各种可能性,包括括号的算法。我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,其中算术符号有+,—,*,/,(,)。其中有效的表达式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表达式。其中我们用枚举类型将符号定义成数字常量,比如用1表示+,2表示-等。如下是我对穷举法的一种编程语言。在编程的头部要对变量做下定义。其中a,b,c,d的范围是1到13。因为传统的24点游戏是纸牌游戏,而纸牌游戏的数字就是从1到13,其中a是1,K是13,Q是12,J是11,其他的就是牌面的数字。这就需要在定义变量的时候要有限制。在vc++中的MFC编程中,在定义控件的变量范围可以直接填写变量的最大和最小,在此编程中的最大是13,最小是1。这就给编程写语句带来了方便(因为其自动会生成语句)。下面我介绍下穷举法的主要实现,我们知道要实现24点的算法,就是通过4个数字,4个运算符号和2对括号(最多为2对),通过各种组合判断其结果是否为24。我们用a,b,c,d代替4个数字。考虑每种可能,总的算法就有7种可能。分别为:1,没括号的(形如a*b*c*d);
内容来自think58 [资料来源:http://think58.com]
2有括号的(形如(a * b) * c * d);3有括号的(形如(a * b * c) * d);4有括号的(形如a * (b * c) * d);5有括号的(形如(a * b) * (c * d));6有括号的(形如((a * b) * c) * d);7有括号的(形如(a * (b * c)) * d)。接下来就是对每一种进行分析判断。我们拿2种情况做为例子,一种是没括号的,一种有括号的。先拿没括号的分析。我们知道没括号的式子包括其运算符和数字总共为7个(3个运算符,4个数字),于是我们定义一个数组,用于存放运算符和数字。运算符我们可以用枚举变量来定义,首先我们通过循环语句形成一个表达式子(但这个表达式的运算循序是乱的)。表达式子有很多种情况,利用循环语句我们可以一一将其写出,例如(a+b+c+d,a+b+c-d,a+b+c*d,a+b+c/d….等等)生成表达式子的后,接着就是判别运算顺序。在没有括号存在的情况下,我们令其先运算*,/。这个顺序的选择很轻松,我们可以定义一个bool类型的函数,我们对数组进行扫描,当扫描到/,*,其返回真值,就直接进行运算。依次照样进行扫描,当所有的/,*运算都进行为止,接着将/,*运算生成的结果合并栈(即将运算的结果放在一个变量中),接着就对其与下一个数字进行运算,直到所有的值都计算出来了,最后将最后运算结果放于一个变量中。我们将这个变量的值和24相减,假如其值是在1E-6之外,则说明此运算式能计算出24。接下来我们来做第2种有括号的算法,有括号的算法和没括号的算法就是在判断运算循序的时候有所差别。我们知道,括号就是用来改变运算顺序而添加的。判断括号的先后顺序,我们同样可以用一个bool类型的函数来判别,在生成表达式要判断其运算顺序时,我们首先扫描表达式存放的数组,假如扫描到左括号,则将先对左括号后面的式子进行运算,接着在是对/,*的优先级进行计算。在第2种(形如(a * b) * c * d)的情况下,我们先将a,b先进行运算,生成其值,并将结果存放与另一个变量中,接着将得到的初步结果和c和d进行运算,最后得到总的结果。将其总结果和24相减,若其值小于1E-6则说明此表达式能算出24。接下来几种有括号的算法和第2种情况类似,我们不做详细的说明。以上就是穷举法的基本实现算法。
copyright think58 [版权所有:http://think58.com]
1.2.2 24点游戏算法(2)
24点游戏的算法各种各样,各有千秋,现在让我们来讨论另一种24点游戏算法。此算法是在dos下实现的,但其思想明确,语句简短。其主要思想是简化算法,他将24点的算法排序分成如下几种,如下我们用a,b来代替变量。他将其分成如下6种情况,分别是a+b,a-b,b-a,a*b,a/b,b/a这6种情况,我们知道a+b和b+a是一样的,a*b和b*a是一样的。这样就可以省去2种算法。提高系统的使用效率,内存占用量小。还有其第2个思想是在判别24点正确与否的时候,采用了与24点相减绝对直在1E-6之外则判别其为正确,这就给运算带来了精确度,就如5 5 5 1等的数字也可以轻松算出,不会略过了。如下我们通过一段程序来看看其主程序段。
bool Search(int n)
{
if (n == 1) {
if ( fabs(number[0] - NUMBER_TO_CAL) < PRECISION ) {
cout << expression[0] << endl;
return true;
} else { 内容来自think58 [来源:http://www.think58.com]
return false;
}
} 内容来自think58 [来源:http://think58.com]
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
double a, b;
string expa, expb;
a = number[i];
b = number[j];
number[j] = number[n - 1];
expa = expression[i];
expb = expression[j];
expression[j] = expression[n - 1];
expression[i] = '(' + expa + '+' + expb + ')';
number[i] = a + b; think58
if ( Search(n - 1) ) return true;
expression[i] = '(' + expa + '-' + expb + ')';
number[i] = a - b;
if ( Search(n - 1) ) return true;
expression[i] = '(' + expb + '-' + ex
内容来自think58 [资料来源:www.THINK58.com]