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
输入:
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
|
- {
- //不能同行同列同一斜线
- 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
- {
- //遍历每个列
- //检查该位置是否符合条件
- 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;
- }
- };
总结:采用递归,最难的在于判断是否同一斜线。
-
相关阅读:
陪诊小程序|陪诊系统让就医服务更加人性化
c语言进阶 结构体的声明
iOS——仿写计算器
mysql源码分析——InnoDB的磁盘结构之日志文件格式分析
水牛社软件适合网络新手吗?说说我的看法
新浪微博一键删除所有内容
2022 CSP-S2 提高组 第2轮 复赛 视频
Spring Boot+Spring Security+JWT实现系统认证与授权
基于技能优化算法的函数寻优算法
引力搜索算法(Gravitational_Search_algorithm,GSA)附matlab代码
-
原文地址:https://blog.csdn.net/KUSPCE/article/details/132987125