アルゴリズムのアイデア: 各数値を独立した数式として扱います。式の間に句読点を追加して、合計 4 つの式を作成します。
コードは次のとおりです。 🎜>
コードをコピー コードは次のとおりです:
/**
* 24 メーカー
* @バージョン 1.0.0
* @author laruence
* @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());
$this->notice('計算できません!');
return
}
/**
* 24 ポイント アルゴリズムの PHP 実装を探しています
*/
プライベート関数 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$expLeft = $expressions[$i];
$expRight = $式[$j];
$式[$j] = $式[$level - 1];
$式[$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 . ')'; ->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;
}
関数 __destruct() {
}
}
/* デモ */
$tf = new TwentyFourCal();
$tf->calculate( array(4,8,8,8) ); 🎜>