N皇后

Leetcode51. N 皇后
Leetcode52. N皇后 II

示例

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

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

解法

  • 皇后的限制条件:皇后彼此之间不能相互攻击-->皇后们不能在同一行、同一列、斜对角-->需要一个函数来判断当前皇后位置是否合理 bool isValid()
  • 回溯算法,一行一行放置皇后,每行放置前调用isValid 函数来判断皇后放置的位置
  • 因此 isValid 函数需要输入 当前行、当前列、已摆放的皇后位置
bool isValid(int n, int row, int col, vector<string>& state){
        //同一列
        for(int i=0; i<row; ++i){
            if(state[i][col] == 'Q') return false;
        }
        //斜向左
        for(int i=row-1, j=col-1; i>=0 && j>=0; --i, --j){
            if(state[i][j] == 'Q') return false;
        }
        //斜向右
        for(int i=row-1, j=col+1; i>=0 && j<n; --i, ++j){
            if(state[i][j] == 'Q') return false;
        }

        return true;
    }

总的:

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> ans;
        vector<string> tmp(n, string(n, '.'));
        dfs(n, 0, tmp, ans);
        return ans;
    }
    void dfs(int n, int row, vector<string>& state, vector<vector<string>>& ans){
        //到头,结束
        if(row==n){
            ans.push_back(state);
            return;
        }
        //当前行按列搜索
        for(int i=0; i<n; ++i){
            if(!isValid(n, row, i, state)) continue;
            state[row][i] = 'Q';
            dfs(n, row+1, state, ans);
            state[row][i] = '.';
        }

    }
    bool isValid(int n, int row, int col, vector<string>& state){
        //同一列
        for(int i=0; i<row; ++i){
            if(state[i][col] == 'Q') return false;
        }
        //斜向左
        for(int i=row-1, j=col-1; i>=0 && j>=0; --i, --j){
            if(state[i][j] == 'Q') return false;
        }
        //斜向右
        for(int i=row-1, j=col+1; i>=0 && j<n; --i, ++j){
            if(state[i][j] == 'Q') return false;
        }

        return true;
    }
};
posted @ 2020-10-19 19:31  miyanyan  阅读(81)  评论(0编辑  收藏  举报