算法三(回溯算法)

来源:互联网 发布:华为财务共享中心 知乎 编辑:程序博客网 时间:2024/05/29 09:15

回溯算法 说形象一点就是:“走不通,就掉头” 说专业一点就是深度优先的搜索;提到深度优先 那么肯定就有广度优先 这里不讨论广度优先 以下是回溯算法在八皇后问题上的应用

php代码如下

class Empress{    private $queen;//存储位置,例如$queen[2] = 3表示第三行的第四列位置,行列从0计数    public static $count;//总共有多少种排列顺序    private $m;//规模数量    //设置几皇后,返回排列结果    public function getResult($m){        $this->m = $m;        $this->put(0);    }    //判断第$n行放置位置$queen[$n] = $i 是否和前面的行冲突(同行,同列冲突,对角线冲突)    /**     * @param $n 第n行     * @return  bool是否冲突     */    private function attack($n){        for ($i=0;$i<$n;$i++){            if($this->queen[$n] == $this->queen[$i] ||abs($this->queen[$n]-$this->queen[$i]) == abs($n-$i)){                return true;            }        }        return false;    }    /**     *     * 打印函数     */    private function show(){        print_r($this->queen);        for ($i=0;$i<$this->m;$i++){            echo $this->queen[$i].'--';        }    }    /**     *     * 放置第n行的位置     */    private function put($n){        for ($i=0;$i<$this->m;$i++){            $this->queen[$n] = $i;//依次试探 0 1 2 3 4 5 6$queen[0] = 0 ,1,2,3,4,5,6,7            $tmp_res = $this->attack($n);            //如果没有冲突,要么继续放置下一行,要么到最后一行了。            if(!$tmp_res){                if($n==$this->m-1){//走到头 且一路上都不冲突                    $this->show();                    echo '第'.(self::$count+1).'种排列方法';                    echo "<br />";                    self::$count++;                }else{  //继续放置下一行                    $this->put($n+1);                }            }        }    }}class Client{    public static function main(){        $obj = new Empress();        $obj->getResult(4);    }}Client::main();

适用于 按照一定条件“从一头走到另一头”的路径解的问题 专业点叫解空间树
其中也看到用到了递归 递归在用使用“同一种方法”处理同类问题的时候几乎都会用到!要深入理解

0 0
原创粉丝点击