当前位置:   article > 正文

【算法】PHP棋牌24点计算算法实现

php棋牌

今天朋友问到一个题目:从1到10的十个数字中,取4个不重复数字,取数顺序不限,只通过加、减、乘三种运算,运算使用次数不限,各类不限,不允许使用括号,实现计算结果为24的数。问有多少种方案。

如:取4个字数分别为10,2,4,8;则有2种输出方案:10+2+4+8和10*2-4+8两种输出方案。

 

实现思路:

1、取4个不重复的数字;

2、通过不同的组合方式,生成数学表达式;

3、执行表达式返回结果,如为24则是我们需要的。

问题:数学表达式我生成了字符串形式,而字符串无法直接返回运算结果。本来通过eval函数返回的,由于考虑到安全问题,服务器会禁用此函数,实现不具通用性和可移值性。通过查询资料发现可以通过逆波兰式来处理(https://my.oschina.net/u/566545/blog/103030 ),帮引用了此类来实现运算。

 

代码:

  1. <?php
  2. include_once('calc.php');//此类参考 https://my.oschina.net/u/566545/blog/103030
  3. class p24Point{
  4. public function __contruct()
  5. {
  6. }
  7. /**
  8. * 从1到10中任意拿4个数字,不能重复取,顺序不限,只使用加、减、乘三种运算(不能使用括号),运算使用次数不限。
  9. * 问:共有几种运算方案
  10. */
  11. public function puker24Point()
  12. {
  13. for($i = 1; $i <= 10; $i++){
  14. for($j = 1; $j <= 10; $j++){
  15. if($i == $j){
  16. continue;
  17. }
  18. for($k = 1; $k <= 10; $k++){
  19. if($i == $k || $j == $k){
  20. continue;
  21. }
  22. for($l = 1; $l <= 10; $l++){
  23. if($i == $l || $j == $l || $k == $l){
  24. continue;
  25. }
  26. //所有组合情况
  27. $this->to24Point($i, $j, $k, $l);
  28. }
  29. }
  30. }
  31. }
  32. }
  33. /**
  34. *
  35. * 通过4个数字生成表达式
  36. */
  37. private function to24Point($a, $b, $c, $d)
  38. {
  39. $ysf = array('+', '-', '*');
  40. foreach ($ysf as $ys){
  41. foreach($ysf as $ys2){
  42. foreach($ysf as $ys3){
  43. $str = $a .$ys. $b .$ys2. $c .$ys3. $d;
  44. $calc = new \Calc($str);
  45. $result = $calc->calculate();
  46. if($result == 24){
  47. echo $str.'=24;'.'<br/>';
  48. }
  49. /*$val = eval('return '.$str.';');
  50. if($val == 24){
  51. echo $str.'=24;'.'<br/>';
  52. }*/
  53. }
  54. }
  55. }
  56. return true;
  57. }
  58. }
  59. $test = new p24Point();
  60. $test->puker24Point();

结果:共有1332条运算符合条件。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/64317
推荐阅读
相关标签
  

闽ICP备14008679号