005 回溯算法实现 N 皇后问题[C++]

class Solution 
{
public:
    vector<vector<string>> res;

public:
    vector<vector<string>> solveNQueens(int n) 
    {
        vector<string> board;
        string str;

        // 初始化空棋盘
        for (int i = 0; i < n; i++)
        {
            str += '.';
        }
        for (int j = 0; j < n; j++)
        {
            board.push_back(str);
        }
        
        backtrack(board, 0);
        return res;
    }
private:
    void backtrack(vector<string>& board, int row)
    {
        // 1、结束条件
        if (row == board.size())
        {
            res.push_back(board);
            return;
        }
        int n = board[row].size();

        for (int col = 0; col < n; col++)
        {
            // 2、排除不合法的选择,判断是否符合 N 皇后的条件
            if (!isvaild(board, row, col)) continue;

            // 3、做选择,添加 N 皇后
            board[row][col] = 'Q';

            // 4、进入下一个决策,递归寻找下一个 N 皇后
            backtrack(board, row + 1);

            // 5、撤销选择
            board[row][col] = '.';
        }
    }

    bool isvaild(vector<string>& board, int row, int col)
    {
        int n = board[row].size();

        // 1、判断当前列是否有 N 皇后
        for (int i = 0; i < row; i++)
        {
            if (board[i][col] == 'Q')
                return false;
        }
        // 2、判断左上角是否有 N 皇后冲突
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
        {
            if (board[i][j] == 'Q')
                return false;
        }
        // 3、判断右上角是否有 N 皇后冲突
        for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++)
        {
            if (board[i][j] == 'Q')
                return false;
        }
        return true;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_47156401/article/details/120604704