菜鸟一枚,心血来潮用PHP整理一下ACM/ICPC的算法.....(八皇后)

其实就是一种,利用递归实现的DFS,每当一个行上面的皇后确定了位置之后,再走下一个皇后的,实现一次便打印一次~

<?php
$m=new a();
$m->man();
?>
<?php
class a{
protected $n=8;//棋盘的格子数(横、纵)
public $x=array();//定义棋盘二维数组
public $s=0;//到第几种方案了
 public function is_ok($t)//判断是否符合条件(即不同行,不同斜线)
 {
  for($i=0;$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()//将一种方案打印出来
 {
  echo "this is ".$this->s.":<br>";
  $this->s++;
  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==8)$this->dayin();//如果递归到最后一层的时候(八个棋子都安置完),则打印
  else
  {
   for($i=0;$i<$this->n;$i++)
   {
    $this->x[$t]=$i;//试探性的将第t行的棋子放在t列
    if($this->is_ok($t))//判断是否符合条件
    $this->dfs($t+1);//如果符合条件则放置下一行的棋子
   }
  }
 }
 function man()
 {
  $this->dfs(0);
 }
}
?>


转载于:https://my.oschina.net/MrHou/blog/143568

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值