N皇后问题

描述

N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。

数据范围: 1 \le n \le 91≤n≤9

要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n!)O(n!)

例如当输入4时,对应的返回值为2,

对应的两种四皇后摆位如下图所示:

N皇后问题_第1张图片

示例1

输入:

1

返回值:

1

示例2

输入:

8

返回值:

92

知识点:递归

建立一个vector数组来保存行、列的值,从第一行开始循环判断,遍历每列,每列的遍历都是从第一列遍历到最后一列,这样第一行的每个列都会放皇后,再依次递归判断。每列都要判断是否满足不能同行同列同一斜线。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 the n
     * @return int整型
     */
     //判断皇后是否符合条件
     bool isValid(vector &pos,int row,int col)
     {
        //遍历所有已经记录的行
        for(int i=0;i &pos,int &res)
     {
        //如果全部行都选择了位置,就加一(这里有个前提,选位置前已经满足了题干要求,能选完肯定就是满足要求的)
        if(row==n)
        {
            res++;
            return;
        }
        //如果没选完,继续
        for(int i=0;i pos(n,0);
        recursion(n,0,pos, res);
        return res;
    }
};

总结:采用递归,最难的在于判断是否同一斜线。

你可能感兴趣的:(随机刷题分栏,算法)