递归实现N皇后问题
其实是看到一位名为“活在二次元的伪触”的博主昨天还是前天写了篇这个题材的笔记,觉得有点意思,于是想自己来写写。
其实我发现上述那位同学写N皇后问题写得还不错,文末也会给出这位同学用通过递归的方法实现N皇后问题的博文地址。一起学习和提高。
还是先来看看最基础的8皇后问题:
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
扩展到N皇后问题是一样的。
一看,似乎要用到二维数组。其实不需要。一维数组就能判断,比如Arr[i],就可以表示一个元素位于第i行第Arr[i]列——应用广泛的小技巧。而且在这里我们不用考虑去存储整个矩阵,如果Arr[i]存在,那么我们在打印的时候,打印到皇后位置的时候输出1,非皇后位输出0即可。
这种思路的实现方式网上大把,包括前面提到的那位同学,所以也就不要纠结有没有改善有没有提高之类的了,权当一次练习即可。
直接上代码好了,觉得递归方法没什么好说的,空间想想能力好一点儿很容易理解。明天有空再写写非递归实现吧。
/*
* NQueen.cpp
*
* Created on: 2013年12月23日
* Author: nerohwang
*/
//形参rowCurrent表示当前所到的行数
#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
bool Check(int rowCurrent,int *&NQueen); //判断函数
void Print(ofstream &os,int n,int *&NQueen); //打印函数
void Solve(int rowCurrent,int *&NQueen,int n,int &count, ofstream &os); //N皇后问题处理函数,index一般初值为0 //判断函数,凡是横竖有冲突,或是斜线上有冲突,返回FALSE
bool Check(int rowCurrent,int *&NQueen)
{
int i = ;
while(i < rowCurrent)
{
if(NQueen[i] == NQueen[rowCurrent] || (abs(NQueen[i]-NQueen[rowCurrent]) == abs(i-rowCurrent)) )
{
return false;
}
i++;
}
return true;
} //将所有可能出现的结果输出文本文档
void Print(ofstream &os,int n,int *&NQueen)
{
os<<"一次调用\n";
for (int i = ;i < n;i++) {
for(int j = ; j < n; j++)
{
os<<(NQueen[i]==j?:);
os<<setw();
}
os<<"\n";
}
os<<"\n";
}
//核心函数。递归解决N皇后问题,触底则进行打印
void Solve(int rowCurrent,int *&NQueen,int n,int &count, ofstream &os)
{
if(rowCurrent == n) //当前行数触底,即完成了一个矩阵,将它输出
{
Print(os,n,NQueen);
count++;
}
for(int i = ; i < n; i++)
{
NQueen[rowCurrent] = i; //row行i列试一试
if(Check(rowCurrent,NQueen))
{
Solve(rowCurrent+,NQueen,n,count,os); //移向下一行
}
}
} int main()
{
int n; //问题规模
int count = ; //解的计数
cout<<"请输入问题的规模N"<<endl;
cin>>n;
if(n<)
{
cerr<<"问题规模必须大于4"<<endl;
return ;
}
int *NQueen = new int[n];
ofstream os;
os.open("result.txt");
Solve(,NQueen,n,count,os);
cout<<"问题的解有"<<count<<"种方法"<<endl;
os.close();
return ;
}
顺便给出前面提到的那位同学的随笔地址:
http://www.cnblogs.com/FZQL/p/3485616.html
递归实现N皇后问题的更多相关文章
- C#中八皇后问题的递归解法——N皇后
百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections. ...
- java递归求八皇后问题解法
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- 递归与N皇后问题
递归的基本概念 一个函数调用其自身,就是递归 递归的作用 1) 替代多重循环 2) 解决本来就是用递归形式定义的问题 3) 将问题分解为规模更小的子问题进行求解 一行只能有一个皇后,这个根据游戏规则中 ...
- 用递归求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> ] = {-,-,-,-,-,- ...
随机推荐
- Vmware私有云虚拟机(CentOS 6.5 OS)之根分区扩容
注:适用于未使用lvm管理的分区,目前仅在CentOS 6.5 上操作,其他系统尚未测试,请谨慎操作 一.查看当前分区状况 [root@disk-test ~]# df -h Filesystem ...
- Mysql配置文件读取顺序
On Unix, Linux and Mac OS X, MySQL programs read startup options from the following files, in the sp ...
- Android WebView ScrollBar设置
WebView wv; wv.setVerticalScrollBarEnabled(false); 取消Vertical ScrollBar显示 wv.setHorizontalScrollBar ...
- 转:python 多线程就这么简单
多线程 科技在发展,时代在进步,我们的CPU也越来越快,CPU抱怨,P大点事儿占了我一定的时间,其实我同时干多个活都没问题的:于是,操作系统就进入了多任务时代.我们听着音乐吃着火锅的不在是梦想. py ...
- wifidog 认证
首先简介一下什么是Portal认证.Portal认证.通常也会叫Web认证.未认证用户上网时,设备强制用户登录到特定站点,用户能够免费訪问当中的服务.当用户须要使用互联网中的其他信息时,必须在门户站点 ...
- (四)DIH导入结构化数据
(四)DIH导入结构化数据 目前大多数的应用程序将数据存储在关系数据库(如oracle.sql server .mysql等).xml文件中.对这样的数据进行搜索是很常见的应用.所谓的DataImpo ...
- 仿Windows制作TreeView数据加载
时间有限就直接贴源码吧,理解思路即可. 页面代码: <asp:TreeView ID="TreeViewLeft" runat="server" Show ...
- Redis 持久化机制
1.背景 之前在使用redis 时候,没有过多的考虑持久化! 但是这样即使你用了redis 也是徒劳,表面上你是用上了redis 进行缓存数据,感觉已经给自己的架构添加了一个道QPS 防护墙! 哈哈, ...
- FW 配置一个私有的Docker仓库
思维 66 3月1日 发布 建分支 0 分支 收藏 0 收藏 我们在本地开发时,如果内网能部署一台Docker服务器,无疑会极大的方便镜像的分享发布,有些私有镜像就是可以直接放到内网服务器上,省去了不 ...
- 如何在Pycharm设置ES6语法环境
首先 如果不进行相关设置就刚ES6 语法的话,会出现下面提示性错误(运行还是能正常出效果的): (let 飘红, 这只是其中之一, 其他语法也会飘红) 接着,就是解决问题: 首先打开设置: 接着找到下 ...