力扣-51题 N皇后(C++)- 回溯

题目链接:https://leetcode-cn.com/problems/n-queens/
题目如下:
力扣-51题 N皇后(C++)- 回溯_第1张图片力扣-51题 N皇后(C++)- 回溯_第2张图片

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<string> board(n,string(n,'.'));//完成初始化一个空棋盘,因为在全局private中不能定义board中的内容,所以变成局部变量
        backtracking(n,0,board);//参数1为棋盘大小,参数2是表示第几行,参数3是表示当前棋盘
        return result;
    }
    void backtracking(int n,int startRow,vector<string>& board){
        if(startRow==n){
            result.push_back(board);
            return ;
        }

        for(int col=0;col<n;col++){
            if(isValid(startRow,col,board,n)){//判断当前位置是否可以存放
                board[startRow][col]='Q';
                backtracking(n,startRow+1,board);
                board[startRow][col]='.';
            }
        }
    }
    bool isValid(int row,int col,vector<string>& board,int n){
        //n皇后问题的皇后放置的要求:不能相互同行,同列,及同斜线
        //检查行
        for(int i=0;i<col;i++){
            if(board[row][i]=='Q') return false;
        }
        //检查列
        for(int i=0;i<row;i++){
            if(board[i][col]=='Q') return false;
        }

        //检查正斜
        for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){
            if(board[i][j]=='Q') return false;
        }
        //检查负斜
        for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++){
            if(board[i][j]=='Q') return false;
        }

        return true;
    }
private:
    vector<vector<string>> result;
};

你可能感兴趣的:(#,困难题,leetcode,c++,算法)