zoukankan      html  css  js  c++  java
  • 数字游戏:计算24

    声明:算法由PHP大牛鸟哥所写(http://www.laruence.com).

    游戏规则: 输入任意4个数字,然后对其进行+-*/组合,所得数学表达式值等于24.

    算法思路:把每一个数字看做一个独立的数学表达式,表达式之间加上标点符号组合成新表达式,一共组合4次,表达式之间的所有组合可以通过递归来实现.

    代码如下:

    <?php
    /**
     * A 24 maker
     * @version 1.0.0
     * @author laruence<laruence at yahoo.com.cn>
     * @copyright (c) 2009 http://www.laruence.com
     */
    class TwentyFourCal {
        public  $needle = 24;
        public  $precision = '1e-6';
     
        function TwentyFourCal() {
        }
        
        private function notice($mesg) {
            var_dump($mesg);
        }
     
        /**
         * 取得用户输入方法
         */
        public function calculate($operants = array()) {
            try {
                $this->search($operants, 4);
            } catch (Exception $e) {
                $this->notice($e->getMessage());
                return;
            }
            $this->notice('can\'t compute!');
            return;
        }
     
        /**
         * 求24点算法PHP实现
         */
        private function search($expressions, $level) {
            if ($level == 1) {
                $result = 'return ' . $expressions[0] . ';';
                if ( abs(eval($result) - $this->needle) <= $this->precision) {
                    throw new Exception($expressions[0]);
                }
            }
            for ($i=0;$i<$level;$i++) {
                for ($j=$i+1;$j<$level;$j++) {
                    $expLeft  = $expressions[$i];
                    $expRight = $expressions[$j];
                    $expressions[$j] = $expressions[$level - 1];
     
                    $expressions[$i] = '(' . $expLeft . ' + ' . $expRight . ')';
                    $this->search($expressions, $level - 1);
     
                    $expressions[$i] = '(' . $expLeft . ' * ' . $expRight . ')';
                    $this->search($expressions, $level - 1);
     
                    $expressions[$i] = '(' . $expLeft . ' - ' . $expRight . ')';
                    $this->search($expressions, $level - 1);
     
                    $expressions[$i] = '(' . $expRight . ' - ' . $expLeft . ')';
                    $this->search($expressions, $level - 1);
                    
                    if ($expLeft != 0) {
                        $expressions[$i] = '(' . $expRight . ' / ' . $expLeft . ')';
                        $this->search($expressions, $level - 1);
                    }
                    
                    if ($expRight != 0) {
                        $expressions[$i] = '(' . $expLeft . ' / ' . $expRight . ')';
                        $this->search($expressions, $level - 1);
                    }
                    $expressions[$i] = $expLeft;
                    $expressions[$j] = $expRight;
                }
            }
            return false;
        }
     
        function __destruct() {
        }
    }
    
    /* demo */
    $tf = new TwentyFourCal();
    $tf->calculate( array(4,8,8,8) );
    ?>
  • 相关阅读:
    招财宝和余额宝哪个好?注意招财宝三大漏洞
    JavaScript eval() Function
    面向对象设计七大原则
    Web开发应该注意的问题
    表格内容排序(js实现)
    Ruby on Rails Tutorial 第六章 用户模型
    Ruby on Rails Tutorial 第五章 完善布局
    一万小时定律的数学解释
    数据抓取的艺术(三)
    数据抓取的艺术(二)
  • 原文地址:https://www.cnblogs.com/wadeyu/p/2540180.html
Copyright © 2011-2022 走看看