美文网首页
LeetCode51. N皇后问题

LeetCode51. N皇后问题

作者: lifefruity | 来源:发表于2021-03-13 22:19 被阅读0次

还是使用回溯法的套路来完成,具体代码如下,这个题目里的回溯其实就是把放了Q的,重置回'.',也就是空棋,这里返回的是三维的,leetcode里需要是二维的,只要再把结果转换下就行,思路没差别

<?php 

class Solution {

    /**
     * @param Integer $n
     * @return String[][]
     */
    public $result = [];
 
    function solveNQueens($n) {
        $board = [];//step1. 初始化一个空的棋盘,里面都是"."
        for($i = 0; $i < $n; $i++){
            for($j = 0; $j < $n; $j++){
                $board[$i][$j] = '.';
            }
        }
        
        $this->test($board, 0);//棋盘, 行数
        
        return $this->result;
    }
    
    function test($board, $row){
        if($row >= count($board) ){
            $this->result[] = $board;
            return;
        }
        
        $n = count($board[$row]);
        for($col = 0; $col < $n; $col++){//为每列做选择
            if(!$this->valid($board, $row, $col)){
                continue;
            }

            //step1. 做选择
            $board[$row][$col] = 'Q';
            
            //step2. 到下一行做选择
            $this->test($board, $row + 1);
            
            //step3. 撤销选择,重要!!!!!
            $board[$row][$col] = '.';
            
        }
        
    }
    
    function valid($board, $row, $col){
        if(in_array('Q', $board[$row])){//如果行中已经有Q了,不通过
            return false;
        }
        
        for($i = 0; $i <= $row; $i++){//如果列中已经有Q了,不通过
            if($board[$i][$col] == 'Q'){
                return false;
            }
        }

        for($i = 0; $i <= $row ; $i++){//如果对角线中有Q了,不通过
            $newRow = $row - $i;
            $newColOne = $col - $i;
            $newCOlTwo = $col + $i;
            
            if(
                (isset($board[$newRow][$newColOne]) && $board[$newRow][$newColOne] == 'Q')
                || (isset($board[$newRow][$newCOlTwo]) && $board[$newRow][$newCOlTwo] == 'Q')   
            ){
                return false;
            }
        }
        
        
        return true;
    }
}


$obj = new Solution;
$x = $obj->solveNQueens(4);

foreach($x as $one => $v){
    foreach($v as $real){
        echo implode('', $real) . "\n";
    }
    echo "\n";
}

相关文章

  • LeetCode51. N皇后问题

    还是使用回溯法的套路来完成,具体代码如下,这个题目里的回溯其实就是把放了Q的,重置回'.',也就是空棋,这里返回的...

  • LeetCode51. N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on...

  • 回溯之N皇后

    N皇后问题:在 n x n 的棋盘上放置 N 个皇后,使其不能相互攻击。 1. 问题分析 皇后相互攻击是指:在皇后...

  • 风云的ARTS打卡(第四周)

    第4周 Algorithm: N皇后问题 n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间...

  • lintcode-N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。 给定一个整数n,返回所有不同的n皇后问题的...

  • lintcode N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。给定一个整数n,返回所有不同的n皇后问题的解...

  • LeetCode 52. N皇后 II(N-Queens II)

    52. N皇后 II N皇后 IIn 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之...

  • N皇后问题

    N皇后问题

  • 第16章 抽象深度优先搜索

    1、2n皇后问题 算法分析 与n皇后问题类似,如下是n皇后问题的分析,时间复杂度 按行继续比遍历,其中col[x]...

  • LeetCode 51. N皇后(N-Queens)

    51. N皇后 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 ...

网友评论

      本文标题:LeetCode51. N皇后问题

      本文链接:https://www.haomeiwen.com/subject/crdfcltx.html