Arce 发表于 2021-8-21 15:37:54

PHP基于回溯算法解决n皇后问题的方法示例

本文实例讲述了PHP基于回溯算法解决n皇后问题的方法。分享给大家供大家参考,具体如下:
这里对于n皇后问题就不做太多的介绍,相关的介绍与算法分析可参考前面一篇C++基于回溯法解决八皇后问题。
回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。
回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。
回溯法指导思想——走不通,就掉头。设计过程:确定问题的解空间;确定结点的扩展规则;搜索。
这里主要展示怎么用php实现该问题
$tres代表一次可行的尝试
$res 记录总结果
详细数据结构分析 可以参考前面的文章链接。


<?php
//check is valid now
function check($l,$c){
   global $tres;
   global $res;
   global $n,$count;
   foreach($tres as $key=>$value){
   if($key<$l){
   if($value==$c){
       return 0;
   }else if(abs($l-$key)==abs($c-$value)){
      return 0;
   }
    }
   }
   return 1;
}
function scan($line){
   global $tres;
   global $res;
   global $n,$count;
   if($line==$n){
   $res[]=$tres;
    // $tres=array();
    $count++;
   }else{
   for($i=0;$i<$n;$i++){
       if(check($line,$i)==1){
      $tres[$line]=$i;
      $nxline=$line+1;
      scan($nxline);
       }
   }
   }
}
$tres=array();
$res=array();
$n=8;$count=0;
$stime=microtime();
scan(0);
$etime=microtime();
var_dump($res);
echo "there is $count ways !\n";
$t=$etime-$stime;
echo (int)$t."seconds used.";
运行结果:
复制代码 代码如下:


array(92) { => array(8) { => int(0) => int(4) => int(7) => int(5) => int(2) => int(6) => int(1) => int(3) } => array(8) { => int(0) => int(5) => int(7) => int(2) => int(6) => int(3) => int(1) => int(4) } => array(8) { => int(0) => int(6) => int(3) => int(5) => int(7) => int(1) => int(4) => int(2) } => array(8) { => int(0) => int(6) => int(4) => int(7) => int(1) => int(3) => int(5) => int(2) } => array(8) { => int(1) => int(3) => int(5) => int(7) => int(2) => int(0) => int(6) => int(4) } => array(8) { => int(1) => int(4) => int(6) => int(0) => int(2) => int(7) => int(5) => int(3) } => array(8) { => int(1) => int(4) => int(6) => int(3) => int(0) => int(7) => int(5) => int(2) } => array(8) { => int(1) => int(5) => int(0) => int(6) => int(3) => int(7) => int(2) => int(4) } => array(8) { => int(1) => int(5) => int(7) => int(2) => int(0) => int(3) => int(6) => int(4) } => array(8) { => int(1) => int(6) => int(2) => int(5) => int(7) => int(4) => int(0) => int(3) } => array(8) { => int(1) => int(6) => int(4) => int(7) => int(0) => int(3) => int(5) => int(2) } => array(8) { => int(1) => int(7) => int(5) => int(0) => int(2) => int(4) => int(6) => int(3) } => array(8) { => int(2) => int(0) => int(6) => int(4) => int(7) => int(1) => int(3) => int(5) } => array(8) { => int(2) => int(4) => int(1) => int(7) => int(0) => int(6) => int(3) => int(5) } => array(8) { => int(2) => int(4) => int(1) => int(7) => int(5) => int(3) => int(6) => int(0) } => array(8) { => int(2) => int(4) => int(6) => int(0) => int(3) => int(1) => int(7) => int(5) } => array(8) { => int(2) => int(4) => int(7) => int(3) => int(0) => int(6) => int(1) => int(5) } => array(8) { => int(2) => int(5) => int(1) => int(4) => int(7) => int(0) => int(6) => int(3) } => array(8) { => int(2) => int(5) => int(1) => int(6) => int(0) => int(3) => int(7) => int(4) } => array(8) { => int(2) => int(5) => int(1) => int(6) => int(4) => int(0) => int(7) => int(3) } => array(8) { => int(2) => int(5) => int(3) => int(0) => int(7) => int(4) => int(6) => int(1) } => array(8) { => int(2) => int(5) => int(3) => int(1) => int(7) => int(4) => int(6) => int(0) } => array(8) { => int(2) => int(5) => int(7) => int(0) => int(3) => int(6) => int(4) => int(1) } => array(8) { => int(2) => int(5) => int(7) => int(0) => int(4) => int(6) => int(1) => int(3) } => array(8) { => int(2) => int(5) => int(7) => int(1) => int(3) => int(0) => int(6) => int(4) } => array(8) { => int(2) => int(6) => int(1) => int(7) => int(4) => int(0) => int(3) => int(5) } => array(8) { => int(2) => int(6) => int(1) => int(7) => int(5) => int(3) => int(0) => int(4) } => array(8) { => int(2) => int(7) => int(3) => int(6) => int(0) => int(5) => int(1) => int(4) } => array(8) { => int(3) => int(0) => int(4) => int(7) => int(1) => int(6) => int(2) => int(5) } => array(8) { => int(3) => int(0) => int(4) => int(7) => int(5) => int(2) => int(6) => int(1) } => array(8) { => int(3) => int(1) => int(4) => int(7) => int(5) => int(0) => int(2) => int(6) } => array(8) { => int(3) => int(1) => int(6) => int(2) => int(5) => int(7) => int(0) => int(4) } => array(8) { => int(3) => int(1) => int(6) => int(2) => int(5) => int(7) => int(4) => int(0) } => array(8) { => int(3) => int(1) => int(6) => int(4) => int(0) => int(7) => int(5) => int(2) } => array(8) { => int(3) => int(1) => int(7) => int(4) => int(6) => int(0) => int(2) => int(5) } => array(8) { => int(3) => int(1) => int(7) => int(5) => int(0) => int(2) => int(4) => int(6) } => array(8) { => int(3) => int(5) => int(0) => int(4) => int(1) => int(7) => int(2) => int(6) } => array(8) { => int(3) => int(5) => int(7) => int(1) => int(6) => int(0) => int(2) => int(4) } => array(8) { => int(3) => int(5) => int(7) => int(2) => int(0) => int(6) => int(4) => int(1) } => array(8) { => int(3) => int(6) => int(0) => int(7) => int(4) => int(1) => int(5) => int(2) } => array(8) { => int(3) => int(6) => int(2) => int(7) => int(1) => int(4) => int(0) => int(5) } => array(8) { => int(3) => int(6) => int(4) => int(1) => int(5) => int(0) => int(2) => int(7) } => array(8) { => int(3) => int(6) => int(4) => int(2) => int(0) => int(5) => int(7) => int(1) } => array(8) { => int(3) => int(7) => int(0) => int(2) => int(5) => int(1) => int(6) => int(4) } => array(8) { => int(3) => int(7) => int(0) => int(4) => int(6) => int(1) => int(5) => int(2) } => array(8) { => int(3) => int(7) => int(4) => int(2) => int(0) => int(6) => int(1) => int(5) } => array(8) { => int(4) => int(0) => int(3) => int(5) => int(7) => int(1) => int(6) => int(2) } => array(8) { => int(4) => int(0) => int(7) => int(3) => int(1) => int(6) => int(2) => int(5) } => array(8) { => int(4) => int(0) => int(7) => int(5) => int(2) => int(6) => int(1) => int(3) } => array(8) { => int(4) => int(1) => int(3) => int(5) => int(7) => int(2) => int(0) => int(6) } => array(8) { => int(4) => int(1) => int(3) => int(6) => int(2) => int(7) => int(5) => int(0) } => array(8) { => int(4) => int(1) => int(5) => int(0) => int(6) => int(3) => int(7) => int(2) } => array(8) { => int(4) => int(1) => int(7) => int(0) => int(3) => int(6) => int(2) => int(5) } => array(8) { => int(4) => int(2) => int(0) => int(5) => int(7) => int(1) => int(3) => int(6) } => array(8) { => int(4) => int(2) => int(0) => int(6) => int(1) => int(7) => int(5) => int(3) } => array(8) { => int(4) => int(2) => int(7) => int(3) => int(6) => int(0) => int(5) => int(1) } => array(8) { => int(4) => int(6) => int(0) => int(2) => int(7) => int(5) => int(3) => int(1) } => array(8) { => int(4) => int(6) => int(0) => int(3) => int(1) => int(7) => int(5) => int(2) } => array(8) { => int(4) => int(6) => int(1) => int(3) => int(7) => int(0) => int(2) => int(5) } => array(8) { => int(4) => int(6) => int(1) => int(5) => int(2) => int(0) => int(3) => int(7) } => array(8) { => int(4) => int(6) => int(1) => int(5) => int(2) => int(0) => int(7) => int(3) } => array(8) { => int(4) => int(6) => int(3) => int(0) => int(2) => int(7) => int(5) => int(1) } => array(8) { => int(4) => int(7) => int(3) => int(0) => int(2) => int(5) => int(1) => int(6) } => array(8) { => int(4) => int(7) => int(3) => int(0) => int(6) => int(1) => int(5) => int(2) } => array(8) { => int(5) => int(0) => int(4) => int(1) => int(7) => int(2) => int(6) => int(3) } => array(8) { => int(5) => int(1) => int(6) => int(0) => int(2) => int(4) => int(7) => int(3) } => array(8) { => int(5) => int(1) => int(6) => int(0) => int(3) => int(7) => int(4) => int(2) } => array(8) { => int(5) => int(2) => int(0) => int(6) => int(4) => int(7) => int(1) => int(3) } => array(8) { => int(5) => int(2) => int(0) => int(7) => int(3) => int(1) => int(6) => int(4) } => array(8) { => int(5) => int(2) => int(0) => int(7) => int(4) => int(1) => int(3) => int(6) } => array(8) { => int(5) => int(2) => int(4) => int(6) => int(0) => int(3) => int(1) => int(7) } => array(8) { => int(5) => int(2) => int(4) => int(7) => int(0) => int(3) => int(1) => int(6) } => array(8) { => int(5) => int(2) => int(6) => int(1) => int(3) => int(7) => int(0) => int(4) } => array(8) { => int(5) => int(2) => int(6) => int(1) => int(7) => int(4) => int(0) => int(3) } => array(8) { => int(5) => int(2) => int(6) => int(3) => int(0) => int(7) => int(1) => int(4) } => array(8) { => int(5) => int(3) => int(0) => int(4) => int(7) => int(1) => int(6) => int(2) } => array(8) { => int(5) => int(3) => int(1) => int(7) => int(4) => int(6) => int(0) => int(2) } => array(8) { => int(5) => int(3) => int(6) => int(0) => int(2) => int(4) => int(1) => int(7) } => array(8) { => int(5) => int(3) => int(6) => int(0) => int(7) => int(1) => int(4) => int(2) } => array(8) { => int(5) => int(7) => int(1) => int(3) => int(0) => int(6) => int(4) => int(2) } => array(8) { => int(6) => int(0) => int(2) => int(7) => int(5) => int(3) => int(1) => int(4) } => array(8) { => int(6) => int(1) => int(3) => int(0) => int(7) => int(4) => int(2) => int(5) } => array(8) { => int(6) => int(1) => int(5) => int(2) => int(0) => int(3) => int(7) => int(4) } => array(8) { => int(6) => int(2) => int(0) => int(5) => int(7) => int(4) => int(1) => int(3) } => array(8) { => int(6) => int(2) => int(7) => int(1) => int(4) => int(0) => int(5) => int(3) } => array(8) { => int(6) => int(3) => int(1) => int(4) => int(7) => int(0) => int(2) => int(5) } => array(8) { => int(6) => int(3) => int(1) => int(7) => int(5) => int(0) => int(2) => int(4) } => array(8) { => int(6) => int(4) => int(2) => int(0) => int(5) => int(7) => int(1) => int(3) } => array(8) { => int(7) => int(1) => int(3) => int(0) => int(6) => int(4) => int(2) => int(5) } => array(8) { => int(7) => int(1) => int(4) => int(2) => int(0) => int(6) => int(3) => int(5) } => array(8) { => int(7) => int(2) => int(0) => int(5) => int(1) => int(4) => int(6) => int(3) } => array(8) { => int(7) => int(3) => int(0) => int(2) => int(5) => int(1) => int(6) => int(4) } } there is 92 ways ! 0seconds used.
还有要说明的 最后面面的时间计算 不太严谨 高精度的变量php是不能直接相减的 会有严重误差。这里只做临时演示,需要精确计算还得调用相关函数。希望本文所述对大家PHP程序设计有所帮助。
原文链接:http://blog.csdn.net/myphpnotes/article/details/17561613

文档来源:http://www.zzvips.com/article/176576.html
页: [1]
查看完整版本: PHP基于回溯算法解决n皇后问题的方法示例