大家都玩过24点的游戏吧,这里介绍一种24点游戏的解法,用穷举法来搜索出24点的所有解。
1.
游戏规则
.给定4个1-9的整数,对它们进行四则运算,寻找能得到24点的表达式,注意数的位置不能改变。
2.
题目分析
4个整数进行四则运算有4*4*4 = 64种可能的解,把运算规则全穷举出来实际上并不复杂,关键是如何穷举。我们可以用3个整形变量来表示运算符号,用它们的值1234来表示+-*/,这样用3个for循环就可以穷举出所有解了,另外考虑到乘除法和加减法混合的运算顺序问题,需要判断运算优先级。用计算模型的函数来表示,有以下4种可能([]表示符号,o表示数字)
(1) o[]o[]o[]o
(2) o[] (o[]o) []o
(3) o[]o[] (o[]o)
(4) o[]( (o[]o) []o)
我们可以用引入乘除法符号的个数多少来考虑相应的运算优先级
(1)没有乘除:从左到右运算,为第(1)种
(2)有一个乘除,考虑其位置前面(1)、中间(2)、后面(3)
(3)有两个乘除,考虑位置组合(1)(2)(3)(4)都可能
(4)有三个乘除,第(1)种
3.
C语言程序
http://download.csdn.net/my 之C语言程序 解决24点
4.
游戏加一种规则
以上规则不变,再加规则:可以用括号任意改变其优先级
5.
加一种的分析
加括号之后运算情况多了一种
o[](o[] (o[]o))
(不加括号只有乘除的情况下这种规则不可能出现)
并且其运算不再依赖于乘除法的优先级高于加减法,而是由小括号决定,所以我们为了简化算法,在每一种情况下加上小括号,源程序如下。
http://download.csdn.net/my 之 24点的C语言程序
6
.拓展考虑两个问题
(1)如果可以改变4个数字的顺序,算法应该如何改?
(2)如何简化加括号之后的算法?(加括号之后有4*4*4*5=320种情况,实际上有许多重复的情况可以简化)