zl程序教程

您现在的位置是:首页 >  其他

当前栏目

php数字游戏计算24算法

2023-06-13 09:14:34 时间
算法思路:把每一个数字看做一个独立的数学表达式,表达式之间加上标点符号组合成新表达式,一共组合4次,表达式之间的所有组合可以通过递归来实现.
代码如下:
复制代码代码如下:

<?php
/**
*A24maker
*@version1.0.0
*@authorlaruence<laruenceatyahoo.com.cn>
*@copyright(c)2009http://www.laruence.com
*/
classTwentyFourCal{
public$needle=24;
public$precision="1e-6";
functionTwentyFourCal(){
}
privatefunctionnotice($mesg){
var_dump($mesg);
}
/**
*取得用户输入方法
*/
publicfunctioncalculate($operants=array()){
try{
$this->search($operants,4);
}catch(Exception$e){
$this->notice($e->getMessage());
return;
}
$this->notice("can\"tcompute!");
return;
}
/**
*求24点算法PHP实现
*/
privatefunctionsearch($expressions,$level){
if($level==1){
$result="return".$expressions[0].";";
if(abs(eval($result)-$this->needle)<=$this->precision){
thrownewException($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;
}
}
returnfalse;
}
function__destruct(){
}
}
/*demo*/
$tf=newTwentyFourCal();
$tf->calculate(array(4,8,8,8));
?>