2023.7.24

回溯经典应用“N皇后”问题。 本题依旧是利用回溯来做,将棋盘是放在一个vector<string>数组里面,棋盘的行数代表树的高度,棋盘的列数代表树的宽度。 还需要定义一个辅助函数valid用于判断当前棋盘符不符合条件。
下面上代码:
class Solution {
public:
    vector<vector<string>> ans;
    bool valid(int row,int col,int n, vector<string>&chessboard)
    {
        //检查上方
        for(int i=0; i<row; i++)
        {
            if(chessboard[i][col]=='Q') return false;
        }
        //检查左上方
        for(int i=row-1,j=col-1; i>=0&&j>=0; i--,j--)
        {
            if(chessboard[i][j]=='Q') return false;
        }
        //检查右上方
        for(int i=row-1,j=col+1; i>=0&&j<n; i--,j++)
        {
            if(chessboard[i][j]=='Q') return false;
        }
        return true;
    }
    void backtrack(int n,int row,vector<string>&chessboard)
    {
        //中止条件
        if(row == n)
        {
            ans.push_back(chessboard);
            return;
        }
        for(int col=0; col<n; col++)
        {
            if(valid(row,col,n,chessboard))
            {
                chessboard[row][col]='Q';
                backtrack(n,row+1,chessboard);
                chessboard[row][col]='.';
            }
        }
    }
    vector<vector<string>> solveNQueens(int n) {
        vector<string> chessboard(n,string(n,'.'));//初始化棋盘为全"."
        backtrack(n,0,chessboard);
        return ans;
    }
};ps:由于递归是从上往下、每行只会放一个皇后,所以valid函数不需要检查行方向和下方,只需要检查上、左上、右上方向即可。



















