由当时的八皇后而联想到的N皇后的问题

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


你可能感兴趣的:(PHP,算法,八皇后)