其实是看到一位名为“活在二次元的伪触”的博主昨天还是前天写了篇这个题材的笔记,觉得有点意思,于是想自己来写写。

其实我发现上述那位同学写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皇后问题的更多相关文章

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

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

  2. java递归求八皇后问题解法

    八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...

  3. 递归与N皇后问题

    递归的基本概念 一个函数调用其自身,就是递归 递归的作用 1) 替代多重循环 2) 解决本来就是用递归形式定义的问题 3) 将问题分解为规模更小的子问题进行求解 一行只能有一个皇后,这个根据游戏规则中 ...

  4. 用递归求n皇后问题

    此问题是指在n*n的国际象棋棋盘上 ,放置n个皇后,使得这n个皇后均不在,同一行,同一列,同一对角线上,求出合法的方案的数目. 本题可以简单转化为就是求n的全排列中的数放在棋盘上使得这几组数,符合均不 ...

  5. 栈(stack)、递归(八皇后问题)、排序算法分类,时间和空间复杂度简介

    一.栈的介绍: 1)栈的英文为(stack)2)栈是一个先入后出(FILO-First In Last Out)的有序列表.3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的 ...

  6. 算法篇【递归2 -- N皇后问题】

    问题:输入整数N,要求在N*N的棋盘上,互相不能攻击,不在同一行同一列上,切不在对角线上,输出全部方案. 输入: 4 输出: 2  4  1  3 3  1  4  2 思路: 假设在前k-1个摆好的 ...

  7. 递归-N皇后问题

    // // #include <stdio.h> /*可以用回溯,但是我已经不太熟悉回溯了!!!!!!!!呜呜呜 * */ #include <iostream> #inclu ...

  8. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  9. N皇后问题(递归)

    //八皇后递归解法 //#include<iostream> //using namespace std; #include<stdio.h> ] = {-,-,-,-,-,- ...

随机推荐

  1. Sublime 正则 替换方法

  2. 用于ARM上的FFT与IFFT源代码-C语言

    /********************************************************************************* 程序名称:快速傅里叶变换(FFT) ...

  3. Laravel5.1 Middleware中间件(初级)

    中间件?什么鬼? 大家第一次接触这个词都会有这么个疑问,但它其实没那么神秘. 一句话就可以解释它:过滤HTTP请求专用机制. 为什么要使用中间件? 过滤HTTP请求是可以写在别的地方,比如说控制器中 ...

  4. 用训练好的caffemodel对单个/批量图片进行分类

    一.单个图片进行分类 这个比较简单,在*.bat文件中输入以下代码: @echo off set BIN_DIR=D:\caffe\caffe-windows\Build\x64\Release se ...

  5. Convert.ToInt32(string '000000003') 变成了 3

    Convert.ToInt32(string '000000003') 变成了 3 但是在查询的时候需要用的是string 这里的convert.toint32 反而起了坏作用,不是所有的时候都要用c ...

  6. 160817、Java数据类型以及变量的定义

    Java 是一种强类型的语言,声明变量时必须指明数据类型.变量(variable)的值占据一定的内存空间.不同类型的变量占据不同的大小. Java中共有8种基本数据类型,包括4 种整型.2 种浮点型. ...

  7. Distance matrix

    w https://en.wikipedia.org/wiki/Distance_matrix For example, suppose these data are to be analyzed, ...

  8. redo binlog

    w https://dev.mysql.com/doc/refman/5.7/en/innodb-redo-log.html https://dev.mysql.com/doc/refman/5.7/ ...

  9. The JVM found at JAVA_HOME is damaged.Please reinstall or define EXE4J_JAVA_HOME to point to an installed 32-bit JDK or JRE

    一.介绍 exe4j是一个很棒的工具,可以把jar包打包成exe进行运行.他可以把jre环境和打包的exe进行集成,使得打包后的exe应用程序可以在没有安装java的机器上运行(前提是要把exe和jr ...

  10. MiniUI 在线示例

    引用 http://miniui.com/demo/#src=datagrid/celledit.html