<?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) ); |
?> |