leetcode 51 N皇后

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

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回所有不同的 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

 【分析】回溯法的经典应用,可以参考我写的这篇博客:回溯法与N皇后,有什么问题欢迎交流。

以下是这道题的代码实现;

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> res;
        vector<int> queen(n,-1);
        put_queen(res,queen,0);
        return res;
    }
    bool isvalid(vector<int>& queen,int row){
        for(int i = 0; i < row; ++i){
            if( queen[i] == queen[row] || abs(i-row) == abs(queen[i]-queen[row]) )
               return false;
        }
        return true;
    }
    void put_queen(vector<vector<string>> &res,vector<int>& queen,int row){
        int n = queen.size();
        for(int i = 0; i < n; ++i){
            queen[row] = i;
            if(isvalid(queen,row)){
                if( row == n - 1 ){
                    Addsolution(res,queen);
                }
                else{
                    put_queen(res,queen,row+1);
                }
            }
        }
    }
    void Addsolution(vector<vector<string>> &res,vector<int>& queen){
        int n = queen.size();
        vector<string> solution(n,string(n,'.'));
        for(int i = 0; i < n; ++i){
            solution[i][queen[i]] = 'Q';
        }
        res.push_back(solution);
    }
};

猜你喜欢

转载自blog.csdn.net/zpznba/article/details/88931204