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

今天朋友问到一个题目:从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 ),帮引用了此类来实现运算。

 

代码:

<?php 
include_once('calc.php');//此类参考 https://my.oschina.net/u/566545/blog/103030
class p24Point{

    public function __contruct()
    {

    }

    /**
     * 从1到10中任意拿4个数字,不能重复取,顺序不限,只使用加、减、乘三种运算(不能使用括号),运算使用次数不限。
     * 问:共有几种运算方案
     */
    public function puker24Point()
    {

        for($i = 1; $i <= 10; $i++){
            for($j = 1; $j <= 10; $j++){
                if($i == $j){
                    continue;
                }
                for($k = 1; $k <= 10; $k++){
                    if($i == $k || $j == $k){
                        continue;
                    }
                    for($l = 1; $l <= 10; $l++){
                        if($i == $l || $j == $l || $k == $l){
                            continue;
                        }
                        //所有组合情况
                        $this->to24Point($i, $j, $k, $l);
                    }
                }
            }
        }
    }

    /**
     * 
     * 通过4个数字生成表达式
     */
    private function to24Point($a, $b, $c, $d)
    {
        $ysf = array('+', '-', '*');
        foreach ($ysf as $ys){
            foreach($ysf as $ys2){
                foreach($ysf as $ys3){

                    $str = $a .$ys. $b .$ys2. $c .$ys3. $d;

                    $calc = new \Calc($str);
                    $result = $calc->calculate();
                    if($result == 24){
                        echo $str.'=24;'.'<br/>';
                    }

                    /*$val = eval('return '.$str.';');
                    if($val == 24){
                        echo $str.'=24;'.'<br/>';
                    }*/
                }
            }
        }
        return true;
    }
}

$test = new p24Point();
$test->puker24Point();

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值