之前面试某大厂的时候碰到让写速算24点的程序,当时使用了保利排序,感觉写的不是很好,这里再总结一下。
一.速算24点游戏描述:
“巧算24点”是一种数学游戏,游戏方式简单易学,能健脑益智,是一项极为有益的活动.“巧算24点”的游戏内容如下:一副牌中抽去大小王剩下52张,(如果初练也可只用1~10这40张牌)任意抽取4张牌(称牌组),用加、减、乘、除(可加括号)把牌面上的数算成24.每张牌必须用一次且只能用一次,如抽出的牌是3、8、8、9,那么算式为(9—8)×8×3或3×8+(9—8)或(9—8÷8)×3等.
二.思路分析
一般有两种方法,
第一种暴力排列法:
先得到这4张牌的排序,时间复杂度为4!,然后对数字之间的3个空,分别插入4中运算符,这个时间复杂度为4^3,总共的时间复杂度为O(4!*4^3)
第二种方式递归加剪枝:
原来的问题表示为O(24,[a,b,c,d]),那么原来的问题可以分解为O(24-a,[b,c,d]);O(24+a,[b,c,d]);O(24/a,[b,c,d]);O(24*a,[b,c,d])...等对每个数字操作的16个子问题,O(sum,[a,b,c,d])表示找到a,b,c,d之间各种可能的运算组合,使得最终的结果为sum。如果子问题中的sum小于0或者不为整数,那么就停止搜索。这个思想可以使用纯递归加对结果去重,或者使用树。复杂度跟第一种方法是一样的。
思路已知,代码实现起来比较简单,我自己就没有再写。
别人的实现如下:
树模型:
https://zhidao.baidu.com/question/243276790.html
枚举法:
https://blog.csdn.net/wangqiulin123456/article/details/8145545