N-Queens I & II (Leetcode 51, 52)

著名的“N皇后”问题。主要思路是:我们逐行进行DFS,而在每一行的DFS中逐列扫描,放置皇后。

N Queens I: https://leetcode.com/problems/n-queens/description/
N Queens II: https://leetcode.com/problems/n-queens-ii/description/

而判断皇后位置是否合适,则需要一个prevoius position函数。previous[i] = c, means one Queen is on row i, col c。
由于我们逐行DFS,则保证了行不一样。列,和对角线的check利用如下函数,需要遍历所有之前放置的位置。其中对角线的check非常巧妙。

 bool isValid(int row, int col, vector &pos){
        for(int i=0; i

N-Queens I:

class Solution {
public:
    
    bool isValid(int row, int col_idx, vector &record){
        for(int i=0; i> &allcomb, vector &record, int row, int n){
        if(row == n){
            vector comb;
            for(int i=0; i> solveNQueens(int n) {
        vector> allcomb;
        if(n <= 0) return allcomb;
        vector record;
        findcombo(allcomb, record, 0, n);
        return allcomb;
    }
};

II 和 I 的做法基本一样,也是用DFS来做。用一个cnt变量,来记录满足条件个数。

class Solution {
public:
    int totalNQueens(int n) {
        if(n <= 0) return 0;
        int cnt = 0;
        vector pos;
        findcombo(cnt, pos, 0, n);
        return cnt;
    }
    
    void findcombo(int &cnt, vector &pos, int cur, int n){
        if(cur == n){
            cnt++;
        }
        for(int i=0; i &pos){
        for(int i=0; i

你可能感兴趣的:(N-Queens I & II (Leetcode 51, 52))