<?php
/* demo */
$tf = new TwentyFourCal();
$tf->calculate( array(5,5,5,5) );
$tf->calculate( array(2,4,10,10) );
$tf->calculate( array(4,4,10,10) );
$tf->calculate( array(1,2,7,7) );
$tf->calculate( array(4,4,4,4) );
$tf->calculate( array(1,2,1,2) );
class TwentyFourCal {
public $needle = 24;
public $precision = '1e-6';
private function notice($mesg) {
echo $mesg.'<br>';
}
/**
* 取得使用者輸入方法
*/
public function calculate($operants = array()) {
try {
$this->search($operants, 4);
} catch (Exception $e) {
$this->notice($e->getMessage());
return;
}
$this->notice('計算不出24!');
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() {
}
}
?>
效果圖:
((5 * 5) - (5 / 5))
((2 + (4 / 10)) * 10)
(((10 * 10) - 4) / 4)
(((7 * 7) - 1) / 2)
((4 + 4) + (4 * 4))
計算不出24!