力扣 51. N 皇后

83 阅读1分钟

🔗 leetcode.cn/problems/n-…

题目

  • 给 n 个皇后,放在 N * N 的棋盘上,使得皇后之间不可以互相攻击,返回所有的棋盘摆放
  • 皇后可以攻击同行、同列、同斜线的位置

思路

  • 回溯,每次枚举某一行可以放皇后的位置,直到全部枚举完,把过程中皇后摆放的位置进行记录
  • 皇后可以放的位置检查:某列 col 是否摆放过,i+1 j+1 斜线 是否摆放过,判断 n + col - row 即可, i+1 j -1 斜线是否摆放过,判断 col + row 即可
  • 检查到合适位置,递归摆放下一行
  • 递归完成,reset 这一次摆放

代码

class Solution {
public:
    bool col[20], xx[20], yy[20];
    vector<vector<string>> ans;
    void dfs(int n, int row, vector<string>& tmp) {
        if (row == n) {
            ans.push_back(tmp);
            return;
        }

        for (int i = 0; i < n; i++) {
            if (col[i] == false && xx[i - row + n] == false &&
                yy[row + i] == false) {
                col[i] = true;
                xx[i - row + n] = true;
                yy[row + i] = true;
                string st;
                for (int j = 0; j < n; j++) {
                    if (i == j)
                        st += 'Q';
                    else
                        st += '.';
                }
                tmp.push_back(st);
                dfs(n, row + 1, tmp);
                col[i] = false;
                xx[i - row + n] = false;
                yy[row + i] = false;
                tmp.pop_back();
            }
        }
    }

    vector<vector<string>> solveNQueens(int n) {
        memset(col, 0, sizeof col);
        memset(xx, 0, sizeof xx);
        memset(yy, 0, sizeof yy);
        vector<string> tmp;
        dfs(n, 0, tmp);
        return ans;
    }
};