N皇后问题

描述

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

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

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

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

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

示例1

输入:

1

返回值:

1

示例2

输入:

8

返回值:

92

知识点:递归

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

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 the n
     * @return int整型
     */
     //判断皇后是否符合条件
     bool isValid(vector<int> &pos,int row,int col)
     {
        //遍历所有已经记录的行
        for(int i=0;i<row;i++)
        {
            //不能同行同列同一斜线
            if(row==i||col==pos[i]||abs(row-i)==abs(col-pos[i]))
            return false;
        }
        return true;
     }
     //递归查看皇后种类
     void recursion(int n,int row,vector<int> &pos,int &res)
     {
        //如果全部行都选择了位置,就加一(这里有个前提,选位置前已经满足了题干要求,能选完肯定就是满足要求的)
        if(row==n)
        {
            res++;
            return;
        }
        //如果没选完,继续
        for(int i=0;i<n;i++)
        {
            //遍历每个列
            //检查该位置是否符合条件
            if(isValid(pos,row,i))
            {
                //加入位置
                pos[row]=i;
                //递归继续查找
                recursion(n,row+1, pos,res);
            }
        }
     }
    int Nqueen(int n) {
        // write code here
        int res=0;
        vector<int> pos(n,0);
        recursion(n,0,pos, res);
        return res;
    }
};

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值