八皇后

题目描述

来源于 https://leetcode-cn.com/

设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

注意:本题相对原题做了扩展

示例:

 输入:4
 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
 解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

解法:

又一个 dfs,为每一行选择一个放 Q 的位置,至于选那个位置需要考虑该位置上放 Q 是否与已放置的行冲突。

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<string> board(n, string(n, '.'));
        vector<vector<string>> result;
        dfs(board, 0, result);
        return result;
    }

    void dfs(vector<string>& board, int row, vector<vector<string>>& result){
        int n = board.size();
        if(n == row){
            result.push_back(board);
            return;
        }
        for(int col = 0; col < n; col++){
            if(!conflict(board, row, col)){
                board[row][col] = 'Q';
                dfs(board, row + 1, result);
                board[row][col] = '.';
            }
        }
    }

    bool conflict(const vector<string>& board, int row, int col){
        int n = board.size();
        for(int i = 0; i < row; i++){
            if(board[i][col] == 'Q') return true;
            int j = col - (row - i);
            if(j >= 0 && board[i][j] == 'Q') return true;
            j = col + (row - i);
            if(j < n && board[i][j] == 'Q') return true;
        }
        return false;
    }
};