https://leetcode-cn.com/problems/n-queens/
回溯函數 backtrack(row = 0)
- 循環列並且試圖在每個列
column
中放置皇后- 在位置
(row, column)
方格上放置皇后 - 排除同行、同列衝突、對角線的位置
if
所有的行被考慮過,row == N
- 找到一個解
else
- 繼續查找下一行皇后的位置
backtrack(row + 1)
- 繼續查找下一行皇后的位置
- 在位置
#回溯算法
class NQueen{
private $queen; //存儲位置, 例如$queen[2] = 3表示第三行的第四列位置, 行列從0計數
public static $count;
private $num;
//設置皇后數量
public function run($num){
$this->num = $num;
$this->backtrack(0);
}
//判斷第$n行放置位置$queen[$row] = $col 是否和前面的行衝突(同行、同列衝突、對角線衝突)
private function valid($row){
for($i=0; $i<$row; $i++){
if($this->queen[$row] == $this->queen[$i] || abs($this->queen[$row]-$this->queen[$i]) == abs($row-$i)){
return true;
}
}
return false;
}
//打印函數
private function show(){
for($i=0; $i<$this->num; $i++){
for ($j=0; $j<$this->num; $j++){
if($this->queen[$i] == $j){
echo 'X';
}else{
echo 'O';
}
echo ' ';
}
echo '<br/>';
}
}
//放置第n行皇后位置
private function backtrack($row){
for($col=0; $col<$this->num; $col++){
$this->queen[$row] = $col;
if(!$this->valid($row)){
if($row == $this->num-1){
echo '第'.(self::$count+1).'種排列方法<br/>';
$this->show();
echo "<br/>";
self::$count++;
}else{
$this->backtrack($row+1);
}
}
}
}
}
$obj = new NQueen();
$obj->run(4);
/**
第1種排列方法
O X O O
O O O X
X O O O
O O X O
第2種排列方法
O O X O
X O O O
O O O X
O X O O
**/