递归与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);
}
}
}
递归与N皇后问题的更多相关文章
- C#中八皇后问题的递归解法——N皇后
百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections. ...
- 递归实现N皇后问题
其实是看到一位名为“活在二次元的伪触”的博主昨天还是前天写了篇这个题材的笔记,觉得有点意思,于是想自己来写写. 其实我发现上述那位同学写N皇后问题写得还不错,文末也会给出这位同学用通过递归的方法实现N ...
- java递归求八皇后问题解法
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- 用递归求n皇后问题
此问题是指在n*n的国际象棋棋盘上 ,放置n个皇后,使得这n个皇后均不在,同一行,同一列,同一对角线上,求出合法的方案的数目. 本题可以简单转化为就是求n的全排列中的数放在棋盘上使得这几组数,符合均不 ...
- 栈(stack)、递归(八皇后问题)、排序算法分类,时间和空间复杂度简介
一.栈的介绍: 1)栈的英文为(stack)2)栈是一个先入后出(FILO-First In Last Out)的有序列表.3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的 ...
- 算法篇【递归2 -- N皇后问题】
问题:输入整数N,要求在N*N的棋盘上,互相不能攻击,不在同一行同一列上,切不在对角线上,输出全部方案. 输入: 4 输出: 2 4 1 3 3 1 4 2 思路: 假设在前k-1个摆好的 ...
- 递归-N皇后问题
// // #include <stdio.h> /*可以用回溯,但是我已经不太熟悉回溯了!!!!!!!!呜呜呜 * */ #include <iostream> #inclu ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化
上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...
- N皇后问题(递归)
//八皇后递归解法 //#include<iostream> //using namespace std; #include<stdio.h> ] = {-,-,-,-,-,- ...
随机推荐
- SQLAlchemy查询
SQLAlchemy查询 结果查询: from databases.wechat import User from config import session def search(): result ...
- javascript中的constructor
constructor,构造函数,对这个名字,我们都不陌生,constructor始终指向创建当前对象的构造函数. 这里有一点需要注意的是,每个函数都有一个prototype属性,这个prototyp ...
- JAVA debug 调试demo
1.设置断点,在代码的行号后面鼠标左键即可2.想要看调用方法的执行流程,那么调用方法也要加断点. package day6_debug; /* * 1.设置断点,在代码的行号后面鼠标左键即可 * 2. ...
- template_showpost
使用<a href='...'>name<\a>实现点击"name"与转向'...'网址的超链接操作 from django.shortcut import ...
- Linux知识再回顾
Linux再回顾 下面是自己之前centos7的笔记总结第二篇,第一篇是19年就写过了一些,记住Linux中一切皆文件. 这里提下,使用xshell+xftp来使用云服务器是很不错的,强烈建议小伙伴这 ...
- .Net Core MVC 基于Cookie进行用户认证
在打代码之前先说一下思路. 登录的的时候服务端生成加密的字符串(用户名.id.当前时间)并且存入客户端cookie中,服务端的缓存中.对客户端的每次请求进行拦截,解密保存在cookie中的加密字符串. ...
- Docker-Bridge Network 03 自定义网络
本节介绍自定义bridge network的自定义网络. 1.前言2.创建自定义网络2.1 创建网络2.2 指定网段创建网络3.创建容器3.1 指定网络创建容器3.2 指定IP创建容器4.通信4.1 ...
- stand up meeting 1-6
今日更新: 1.修复初始最佳战绩显示bug: 初始为击败全国0% 用户 2.挑战结果界面显示“哎,今天的饭又白吃了,回去多吃两碗###”, 去除API返回string中的“###”. 3.分享模块初 ...
- 牛客练习赛61 相似的子串(二分+Hash)
题面在此 题解:将字符串分成k部分,然后求最长前缀,所以我们只关注前缀部分就好了,公共前缀后边的是啥不用管,那么问题就转化成了是否存在k个不相交的字符串的最长公共前缀问题.首先用Hash来记录一下字符 ...
- S - Primitive Primes CodeForces - 1316C 数学
数学题 在f(x)和g(x)的系数里找到第一个不是p的倍数的数,然后相加就是答案 为什么? 设x1为f(x)中第一个不是p的倍数的系数,x2为g(x)...... x1+x2前的系数为(a[x1+x2 ...