有一个C语言的计算24 game的程序源代码~有些地方是我自己注释的~但是整体看不懂~请大家给我解释一下好吗?(供评论)

首先确认21点的规则如下:

“巧算24分”的游戏:从一副牌中抽出52张牌,(初始训练只能用40张牌(1 ~ 10)随机抽出4张牌(称为副牌),用加减乘除的方法将牌面上的数字数为24(可加括号)。每张卡只能使用一次。如果抽的牌是3,8,8,9,那么公式就是(9-8) × 8× 3或者3× 8+(9-8)或者(9-8 ÷ 8 )× 3等等。

(备注:有人统计过,一副牌(52张)有1820种不同组合,458张不能算24分。)

然后分析代码部分:

Int main(void) //主函数部分

{

search 24(0);//参见chk函数。只要找到解决方案,使用exit(0)直接终止程序。

printf("没有回答。\ n ");//表示无解。

}

Int search24(int d) //算法,整个程序的核心,注意d是递归结束条件。

{

//这个应该是楼主不懂的。

//建议用一组(3,8,8,9)的例子来跟踪调试,以便了解别人的算法。

//这类问题需要算术表达式穷举法的知识。可以先学习这些知识来理解程序。

}

另外三个功能是进一步的数据处理。

void make(int i,float p,float q,char o,int d)

浮点计算(浮点n1,浮点n2,字符o)

void chk(浮点k)

简要介绍算术表达式穷举法的知识和在网络上实现的算法原理:

基本原理是枚举四个整数所有可能的表达式,然后对表达式求值。

表达式的定义:表达式=(表达式|数字)运算符(表达式|数字)

因为可以使用的四个运算符+-*/都是2元运算符,所以本文只考虑2元运算符。2元运算符接收两个参数并输出计算结果,输出结果参与后续计算。

根据上述内容,构建所有可能表达式的算法如下:

(1)将四个整数放入一个数组。

(2)取数组中两个数的排列,* * *有P(4,2)种排列。对于每种布置,

(2.1)对于+-*/的每个运算符,

(2.1.1)根据此排列中两个数的和运算符计算结果。

(2.1.2)换表数组:将这个排列中的两个数从数组中去掉,将2.1.1的计算结果放入数组中。

(2.1.3)对新阵列重复步骤2。

(2.1.4)还原数组:将此排列中的两个数相加到数组中,并将2.1.1的计算结果从数组中删除。

这说明这是一个递归的过程。第二步是递归函数。当数组中只剩下一个数时,这就是表达式的最终结果,递归结束。

在程序中,一定要注意递归的字段保护和恢复,即递归调用前后字段状态要一致。在上面的算法中,递归场景是指数群,2.1.2改变数组进行下一次递归调用,2.1.3恢复数组保证当前递归调用得到下一次正确的排列。

括号()的作用只是改变运算符的优先级,即运算符的计算顺序。所以在上面的算法中,不需要考虑括号。输出时只考虑括号。