算法篇【递归2 -- N皇后问题】
问题:输入整数N,要求在N*N的棋盘上,互相不能攻击,不在同一行同一列上,切不在对角线上,输出全部方案。
输入:
4
输出:
2 4 1 3
3 1 4 2
思路:
假设在前k-1个摆好的条件下,求出第k个皇后的摆法,并保存,继续求第k+1个皇后的摆法,直到找到合适的摆法。
#include <iostream>
#include <cmath>
using namespace std;
int N ;
int queenPos[] ;
//用来存放算好的皇后的位置,比如第1行皇后在第i列,则queenPos[0]=i; 第2行皇后在第j列,则queenPos[1]=j;依次输出所有n行皇后的位置
void NQueen(int k);
//NQueen(k) 表示前k-1个皇后都摆好的情况下,第k个皇后的摆法。 int main(){
cout << "Please Input N " << endl;
cin >> N ;
NQueen() ;//从第0行开始摆皇后 ,直到摆好N行
return ;
system("pause");
} void NQueen(int k){
int i ;
if(k==N){
//递归函数的结束条件。从第1个皇后到第N个皇后都已经摆好了
for(int i=; i<N; i++){
cout << queenPos[i] + << " ";
}
cout << endl;
return ;
} //该for循环用来尝试第k个皇后的位置 ,位置为变量i
for(int i=; i<N; i++){
int j ;
//变量j的循环用来判断第k个皇后放在位置i列处,是否和已经摆好的k-1个皇后的列位置queenPos[j]冲突
for(j=; j<k; j++){
if(queenPos[j] == i ||//第k个皇后摆在第i列和已经摆放的皇后列位置有相同的。
abs(queenPos[j]-i) == abs(k-j)//列的绝对值只差==行的绝对值只差,k-j中的k表示第k个皇后在第k行,循环变量j表示的是已经摆好的行数下标。
)
break ;
}
if(j==k){//前面j的for循环没有break,则表示当前第k行的位置i不冲突,则保存该值,并在此基础上求下一行皇后的摆放位置
queenPos[k] = i;
NQueen(k+);//首先会判断新的k是否==N,是的话,则输出摆放位置 ,return到NQueen[N-1],...直到返回NQueen【0】,main函数执行return 0.
}
}
//假设N=4,由于求NQueen(0)时,第一个皇后的位置是2,此时在for(int i=0; i<N; i++)。的循环中,成功return 之后返回到for 循环中,重新计算出下一个合理摆法
}

算法篇【递归2 -- N皇后问题】的更多相关文章
- 算法学习->递归典例N皇后问题
00 问题 在NN(这个N==N皇后的N)的方格棋盘上放置n个皇后,要求:1.每个皇后在不同行不同列:2.每个皇后在不同左右对角线 输出要求:输出符合条件的所有解,解以皇后的坐标的形式. 01 思路 ...
- [Python笔记]第五篇:递归
本篇主要内容:递归以及冒泡排序 参考文章:(http://www.cnblogs.com/balian/archive/2011/02/11/1951054.html) 递归的概念 递归的概念很简单, ...
- 递归实现N皇后问题
其实是看到一位名为“活在二次元的伪触”的博主昨天还是前天写了篇这个题材的笔记,觉得有点意思,于是想自己来写写. 其实我发现上述那位同学写N皇后问题写得还不错,文末也会给出这位同学用通过递归的方法实现N ...
- 扩展欧几里德算法(递归及非递归实现c++版)
今天终于弄懂了扩展欧几里德算法,有了自己的理解,觉得很神奇,就想着写一篇博客. 在介绍扩展欧几里德算法之前,我们先来回顾一下欧几里德算法. 欧几里德算法(辗转相除法): 辗转相除法求最大公约数,高中就 ...
- C#中八皇后问题的递归解法——N皇后
百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections. ...
- 汉诺塔算法的递归与非递归的C以及C++源代码
汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...
- C 实现的算法篇
算法的定义:算法是解决实际问题的一种精确的描述方法,目前,广泛认同的定义是:算法的模型分析的一组可行的确定的和有穷的规则 算法的五个特性:有穷性,确切性,输入,输出,可行性.目前算法的可执行的步骤非常 ...
- 深度学习word2vec笔记之算法篇
深度学习word2vec笔记之算法篇 声明: 本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...
- 算法篇(前序)——Java的集合
菜鸟拙见,望请纠正:附上JDK参考文档(中文文档和英文文档):链接:https://pan.baidu.com/s/14KDmCtQxeGCViq7e0zENjA 密码:e9xs 以及算法篇全文链接 ...
- FCC编程题之中级算法篇(下)
介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Smallest Common Multiple 2. Finders ...
随机推荐
- PHP + Apache 在 Linux(centos7)系统下的环境搭建,基于 yum
(本文采用的是 Centos7 的操作系统,简单起见,以下全部采用 yum 安装,有这么好用的东西为什么要自己去一个一个编译呢) 1, 安装 Apache => yum -y install ...
- Swoole 进程管理
用法: $process = new swoole_process(function(){ //这里写业务代码 },true) //开启进程,返回进程pid $pid = $process->s ...
- Oracle修改表或者字段的注释
转自:https://www.cnblogs.com/fx-blog/p/7132833.html 语句:comment on table 表名 is '表的注释信息'; comment on col ...
- ueditor修改工具栏固定位置和显示空白div
ueditor.all.js
- LeetCode 题解:Populating Next Right Pointers in Each Node I & II 二有难度。考虑不全面。
每次应该把root同层的右侧节点传过来.如果没有,就传NULL. 同时,应该是先右后左. 感觉这次的代码还挺简洁的.. void construct(struct TreeLinkNode *root ...
- A New Year, A New Accent!
A New Year, A New Accent! Share Tweet Share Happy New Year! Does your list of resolutions include i ...
- Number的Util
1. NumberUtils.isNumber() : 判断字符串是否是数字 NumberUtils.isNumber("5.96");//结果是true NumberUtils. ...
- Python正则表达式与re模块介绍
Python中通过re模块实现了正则表达式的功能.re模块提供了一些根据正则表达式进行查找.替换.分隔字符串的函数.本文主要介绍正则表达式先关内容以及re模块中常用的函数和函数常用场景. 正则表达式基 ...
- [PHP]PHP自定义遍历目录下所有文件的方法
header('content-type:text/html;charset=utf-8');/** * 方法一:使用readir()遍历目录 */function listDir($dir){ ...
- ie11 调试工具不能使用
使用ie11仿真ie8测试兼容性的时候,方便调试 dom和仿真都不能用 搜索 https://www.ludou.org/win7-ie-11-f12-bug.html也有相关问题 安装补丁 64位的 ...