题解 | #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)
全部评论

相关推荐

ALEX_BLX:虽然说聊天记录不可信,不过这个趋势确实如此但我觉得也要想到一点就是卷后端的人里真正有“料”的人又有多少,我说的这个料都不是说一定要到大佬那种级别,而是就一个正常的水平。即使是现在也有很多人是跟风转码的,2-3个月速成后端技术栈的人数不胜数,但今时不同往日没可能靠速成进大厂了。这种情况就跟考研一样,你能上考场就已经打败一半的人了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务