问题:输入整数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皇后问题】的更多相关文章

  1. 算法学习->递归典例N皇后问题

    00 问题 在NN(这个N==N皇后的N)的方格棋盘上放置n个皇后,要求:1.每个皇后在不同行不同列:2.每个皇后在不同左右对角线 输出要求:输出符合条件的所有解,解以皇后的坐标的形式. 01 思路 ...

  2. [Python笔记]第五篇:递归

    本篇主要内容:递归以及冒泡排序 参考文章:(http://www.cnblogs.com/balian/archive/2011/02/11/1951054.html) 递归的概念 递归的概念很简单, ...

  3. 递归实现N皇后问题

    其实是看到一位名为“活在二次元的伪触”的博主昨天还是前天写了篇这个题材的笔记,觉得有点意思,于是想自己来写写. 其实我发现上述那位同学写N皇后问题写得还不错,文末也会给出这位同学用通过递归的方法实现N ...

  4. 扩展欧几里德算法(递归及非递归实现c++版)

    今天终于弄懂了扩展欧几里德算法,有了自己的理解,觉得很神奇,就想着写一篇博客. 在介绍扩展欧几里德算法之前,我们先来回顾一下欧几里德算法. 欧几里德算法(辗转相除法): 辗转相除法求最大公约数,高中就 ...

  5. C#中八皇后问题的递归解法——N皇后

    百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections. ...

  6. 汉诺塔算法的递归与非递归的C以及C++源代码

    汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...

  7. C 实现的算法篇

    算法的定义:算法是解决实际问题的一种精确的描述方法,目前,广泛认同的定义是:算法的模型分析的一组可行的确定的和有穷的规则 算法的五个特性:有穷性,确切性,输入,输出,可行性.目前算法的可执行的步骤非常 ...

  8. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

  9. 算法篇(前序)——Java的集合

    菜鸟拙见,望请纠正:附上JDK参考文档(中文文档和英文文档):链接:https://pan.baidu.com/s/14KDmCtQxeGCViq7e0zENjA 密码:e9xs  以及算法篇全文链接 ...

  10. FCC编程题之中级算法篇(下)

    介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Smallest Common Multiple 2. Finders ...

随机推荐

  1. PHP + Apache 在 Linux(centos7)系统下的环境搭建,基于 yum

    (本文采用的是 Centos7 的操作系统,简单起见,以下全部采用 yum 安装,有这么好用的东西为什么要自己去一个一个编译呢) 1, 安装 Apache  => yum -y install ...

  2. Swoole 进程管理

    用法: $process = new swoole_process(function(){ //这里写业务代码 },true) //开启进程,返回进程pid $pid = $process->s ...

  3. Oracle修改表或者字段的注释

    转自:https://www.cnblogs.com/fx-blog/p/7132833.html 语句:comment on table 表名 is '表的注释信息'; comment on col ...

  4. ueditor修改工具栏固定位置和显示空白div

    ueditor.all.js

  5. LeetCode 题解:Populating Next Right Pointers in Each Node I & II 二有难度。考虑不全面。

    每次应该把root同层的右侧节点传过来.如果没有,就传NULL. 同时,应该是先右后左. 感觉这次的代码还挺简洁的.. void construct(struct TreeLinkNode *root ...

  6. 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 ...

  7. Number的Util

    1. NumberUtils.isNumber() : 判断字符串是否是数字 NumberUtils.isNumber("5.96");//结果是true NumberUtils. ...

  8. Python正则表达式与re模块介绍

    Python中通过re模块实现了正则表达式的功能.re模块提供了一些根据正则表达式进行查找.替换.分隔字符串的函数.本文主要介绍正则表达式先关内容以及re模块中常用的函数和函数常用场景. 正则表达式基 ...

  9. [PHP]PHP自定义遍历目录下所有文件的方法

    header('content-type:text/html;charset=utf-8');/** *   方法一:使用readir()遍历目录 */function listDir($dir){  ...

  10. ie11 调试工具不能使用

    使用ie11仿真ie8测试兼容性的时候,方便调试 dom和仿真都不能用 搜索 https://www.ludou.org/win7-ie-11-f12-bug.html也有相关问题 安装补丁 64位的 ...