题解 | #N皇后问题#

N皇后问题

https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6

class Solution {
    vector<int> col, dg, udg;
    int n;
public:
    /**
     * 
     * @param n int整型 the n
     * @return int整型
     */
    int Nqueen(int _n) {
        // write code here
        n = _n;
        col = vector<int>(n);
        dg = udg = vector<int>(2 * n);
        return dfs(0);
    }

    int dfs(int x) {
        if (x == n) return 1;
        else {
            int res = 0;
            for (int y = 0; y < n; y++) {
                if (!col[y] && !dg[y - x + n] && !udg[y + x]) {
                    col[y] = dg[y - x + n] = udg[y + x] = true;
                    res += dfs(x + 1);
                    col[y] = dg[y - x + n] = udg[y + x] = false;
                }
            }
            return res;
        }
    }
};
  • 思路:递归+三个状态数组
  • 使用列、正对角线和负对角线三个数组来维护哪些位置不能放皇后
  • 正对角线:y = x + k -> k = y - x 有可能小于0,需要加上n使其变为正数
  • 1、遍历每一行
  • 2、枚举将皇后放在每一列的位置
  • 3、如果当前位置的三个数组值都是false,则继续遍历下一行,直到遍历至末尾
  • 时间复杂度:O(n!)
  • 空间复杂度:O(n)
全部评论

相关推荐

04-08 10:36
已编辑
华南理工大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务