递归与N皇后问题
时间:2022-07-28
本文章向大家介绍递归与N皇后问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
递归的基本概念
一个函数调用其自身,就是递归
递归的作用
1) 替代多重循环 2) 解决本来就是用递归形式定义的问题 3) 将问题分解为规模更小的子问题进行求解
一行只能有一个皇后,这个根据游戏规则中的皇后的势力就可以得知。 首先先让A皇后放在左上角(0,0),B皇后再从第二行找到合适的位置,以此类推C皇后在第三行找到合适的位置,一直到N皇后,一组解就出来了,但是问题并不是这么简单。 假设现在是4皇后问题,第A个皇后在(0,0)B皇后在(1,3) C皇后在(3,1)此时D皇后就无位置可以放置。 细心的你,可能会有疑问,每次D皇后,找不到合适的位置,就去让BC重新寻找位置,当BC皇后在它所处的行,再也找不到合适的位置,A皇后的位置就需要变动了。棋盘上就一个皇后A,寻找他的合适位置只需右移一个位置即可。A皇后位移后,再去为BC皇后找合适位置,如果有合适位置,就再去为D皇后寻找合适的位置;如果BC皇后都没有合适的位置,就需要再次右移A皇后,循环上面的过程。
#include<bits/stdc++.h>
using namespace std;
int N;
int queenPos[100];
/*用来存放算好的皇后位置。最左上角是(0,0)
每一行都有一个只用记录它的列坐标*/
void NQueen(int k);
int main()
{
cin >> N;
NQueen(0); //从第0行开始摆皇后
return 0;
}
void NQueen(int k)
{ //在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后
int i;
if(k==N)
{ // N 个皇后已经摆好
for(i=0;i<N;i++)
cout<<queenPos[i]+1<<" ";
cout<<endl;
return ;
}
for(i=0;i<N;i++)
{ //逐尝试第k个皇后的位置
int j;
for( j = 0; j < k; j ++ )
{//和已经摆好的k 个皇后的位置比较,看是否冲突
if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j)) break;
//冲突,则试下一个位置
}
if( j == k )
{ //当前选的位置i 不冲突
queenPos[k] = i; //将第k个皇后摆放在位置i
NQueen(k+1);
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何在nodejs中实现兄弟进程通信
- Python异常处理
- Python装饰器实现函数动态类型检查
- 如何自动填充SQL语句中的公共字段
- 面试官喜欢问的Java编译期与运行期问题总结全了
- 面试5年25K程序员回答不出来为什么Java的main方法必须是public static void?
- Python装饰器
- 3分钟短文:十年窖藏,Laravel告诉你表单验证的“正确姿势”
- 面试官:说说SpringBoot中Spring容器的启动过程
- Python IO
- Python解析式
- 面试官:Tomcat 的调优怎么做?你的最佳实践有哪些?
- Tomcat源码分析
- lazy-mock ,一个生成后端模拟数据的懒人工具
- Python拉链法和开地址法实现字典