算法三(回溯算法)
来源:互联网 发布:华为财务共享中心 知乎 编辑:程序博客网 时间: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
- 算法三(回溯算法)
- 算法:回溯(试探)算法
- 回溯算法(1)
- 迷宫(回溯算法)
- 回溯算法--三连游戏(人机对战)
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 回溯算法
- 安装win10 以及 office2016遇到的问题
- 数据结构学习笔记--队列
- Gym 100712D Alternating Strings 动态规划
- ViewPagerIndicator的简单实用
- poj 3252 Round Numbers(数位dp)
- 算法三(回溯算法)
- JVM类加载机制—加载的顺序问题
- android json解析及简单例子
- GestureDetector 手势识别器
- JAVA EE 自学路线
- js的继承问题
- 吴韦朋:一个“深漂”从零到百万的365天创业日记(连载3)
- 利用线程解决生产者——消费者问题
- 存储过程,函数,触发器的区别