其实就是一种,利用递归实现的DFS,每当一个行上面的皇后确定了位置之后,再走下一个皇后的,实现一次便打印一次~
$m=new a();
$m->man();
?>
class a{
protected $n=8;//棋盘的格子数(横、纵)
public $x=array();//定义棋盘二维数组
public $s=0;//到第几种方案了
public function is_ok($t)//判断是否符合条件(即不同行,不同斜线)
{
for($i=0;$i
if($this->x[$t]==$this->x[$i]||ABS($this->x[$t]-$this->x[$i])==ABS($t-$i))return false;
return true;
}
function dayin()//将一种方案打印出来
{
echo "this is ".$this->s.":
";
$this->s++;
for($i=0;$in;$i++){
for($j=0;$jn;$j++){
if($this->x[$i]==$j)echo "@";//如果本i行的棋子确实被放到了j列,则打印出皇后
else echo "#";
}
echo "
";
}
}
function dfs($t)//深搜,主要的代码部分
{
if($t==8)$this->dayin();//如果递归到最后一层的时候(八个棋子都安置完),则打印
else
{
for($i=0;$in;$i++)
{
$this->x[$t]=$i;//试探性的将第t行的棋子放在t列
if($this->is_ok($t))//判断是否符合条件
$this->dfs($t+1);//如果符合条件则放置下一行的棋子
}
}
}
function man()
{
$this->dfs(0);
}
}
?>