[问题描述] 

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九 世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上, 问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作 者发表了40种不同的解,后来有人用图论的方法解出92种结果。

[需求分析]

这个问题包括了行,列,两条对角线;

列:规定每一列放一个皇后,不会造成列上的冲突;

行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;

1.输入

W,N W1,V1 W2,V2 ......

2.输出

纵向排序输出

3.测试数据

10,3 3,4 4,5 5,6

 [概要设计]

1.解决冲突问题:

这个问题包括了行,列,两条对角线;

列:规定每一列放一个皇后,不会造成列上的冲突;

行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;

对角线:对角线有两个方向。在这我把这两条对角线称为:主对角线和从对角线。在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。

2.数据结构的实现

而对于数据结构的实现,学生则是着重于:

数组a[I]:a [I]表示第I个皇后放置的列;I的范围:1..8;

对角线数组:b[j](主对角线),c[j](从对角线),根据程序的运行,去决定主从对角线是否放入皇后;

1 .数据初始化。

2 2 .从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领)。如果是,摆放第n个皇后,并宣布占领(记得姚横列竖列斜列一起设置),接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当n<=8,m=8时,发现此时已无法摆放时,便要进行回溯。从问题的某一种可能出发,搜索从这种情况能出发,继续搜索,这种不断“回溯”的寻找解的方法,称为“回溯法”。

3.使用数组实现回溯法的思想。

4.当n>8时,便打印出结果。

5.输出函数我使用printf输出,运行形式为:第m种方法为:* * * * * * * *

[完整程序]

#include <conio.h>

#include <math.h>

#include <stdlib.h>

#include <stdio.h>

#include <iostream.h>

#define QUEENS 8

int iCount = 0;  //!记录解的序号的全局变量。

int Site[QUEENS];   //!记录皇后在各行上的放置位置的全局数组。

void Queen(int n); //!递归求解的函数。

void Output();//!输出一个解。

int IsValid(int n);

//!判断第n个皇后放上去之后,是否有〉冲突。

void main() /*----------------------------Main:主函数。----------------------------*/

{

system("title 叶青--递归算法八皇后问题 ");

cout << "                    " << "八皇后的解法:" << endl;

cout << "        " << "-------------------------------------" << endl;

Queen(0);  //!从第0行开始递归试探。

getch();//!按任意键返回。

}

void Queen(int n)   /*-----------------Queen:递归放置第n个皇后,程序的核心!----------------*/

{

int i;

if (n == QUEENS)  //!参数n从0开始,等于8时便试出了一个解,将它输出并回溯。

{

Output();        return;

}

for (i = 1; i <= QUEENS; i++)  //!n还没到8,在第n行的各个行上依次试探。

{

Site[n] = i;  //!在该行的第i行上放置皇后。

if (IsValid(n))   //!如果放置没有冲突,就开始下一行的试探。

Queen(n + 1);

}

}

int IsValid(int n) /*------IsValid:判断第n个皇后放上去之后,是否合法,即是否无冲突。------*/

{

int i;

for (i = 0; i < n; i++)  //!将第n个皇后的位置依次于前面n-1个皇后的位置比较。

{

if (Site[i] == Site[n])  //!两个皇后在同一列上,返回0。

return 0;

if (abs(Site[i] - Site[n]) == (n - i))  //!两个皇后在同一对角线上,返回0。

return 0;

}

return 1; //!没有冲突,返回1。

}

void Output()/*------------Output:输出一个解,即一种没有冲突的放置方案。------------*/

{

int i;

printf("No.%-5d", ++iCount); //!输出序号。

for (i = 0; i < QUEENS; i++)//!依次输出各个行上的皇后的位置,即所在的列数。

printf("%d ", Site[i]);

printf("\n");

}

八皇后算法分析及源代码相关推荐

  1. 使用回溯算法分析八皇后问题

    一. 八皇后问题? 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法? 二.思路 1.首先如何解决递归问题呢? *找到递推公式* ...

  2. 算法分析与设计——八皇后问题(回溯法)

    在国际象棋中,皇后是最厉害的棋子,可以横走.直走,还可以斜走.棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 -- 即任意两个皇后都不能 ...

  3. 算法分析与设计-八皇后问题(回溯法)

    回溯法: 回溯的意义是在递归直到可解的最小问题后,逐步返回原问题的过程,而这里所说的回溯算法实际上是一个类似枚举的搜索尝试方法,它的主题思想是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 ...

  4. 【181116】VC++八皇后格子图形演示源程序源代码

    源码下载简介 八皇后VC++格子图形显示演示,搞不懂是怎么一回事,有兴趣的研究一下,类似黑白棋的界面,但运行的时候发觉显然不是黑白棋,棋子按一定规则动画显示,效果图如上. 源码下载地址:点击下载 备用 ...

  5. Prolog学习:数独和八皇后问题

    上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...

  6. 数据结构 - 递归 回溯算法(八皇后问题)

    游戏地址自己写完了可以根据结果去测试一下. 算法分析 八皇后问题算法思路分析 1)第一个皇后先放第一行第一列 2)第二个皇后放在第二行第一列.然后判断是否OK, 如果不OK,继续放在.第二列.第三列. ...

  7. 八皇后问题详解(最短代码)

    八皇后问题算法分析: 分析1:八皇后由一个64格的方块组成,那么把八个皇后放入不考虑其他情况利用穷举法,有8^64种 可能. 分析2:显然任意一行有且仅有1个皇后,使用数组queen[0->7] ...

  8. 八皇后(N皇后)问题

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

  9. 爬山法求解八皇后问题的全部解法

    爬山法求解八皇后问题的全部解法 程序的概要设计思想 初始状态 冲突函数 寻找邻居状态 寻找全部解集 程序主要函数的作用 运行结果截图 Python源代码 程序的概要设计思想 爬山算法是一种局部贪婪算法 ...

最新文章

  1. SQL GROUP BY 语句
  2. qt-designer使用教程1--HelloWorld
  3. mysql配置多个域名访问吗,tomcat部署多个项目,通过域名解析访问,不同的网站...
  4. ITIL内部培训资料(IT服务持续性管理(IT Service Continuity Management) )
  5. 彻底理解ThreadLocal
  6. 基于float的几种布局
  7. Spark SQL 和 Hive UDF ExceptionInInitializerError getRemoteBlockReaderFromTcp BlockReaderFactory
  8. 基础入门_Python-模块和包.Gevent异步服务类实现多姿势WEB实时展示?
  9. MySql 存储过程 光标只循环一次
  10. 很特别的动态规划教程
  11. 多线程(what,why,when)
  12. 什么?吴宗宪在淘宝帮你买买买?
  13. 记忆训练: 记数字 (110数字图像编码)
  14. 图像去雨RESCAN论文笔记
  15. 使用python计算与你投缘与无缘的生肖
  16. 常用计算机英文缩写,计算机常用英文缩写
  17. hadoop3访问hdfs web控制页面遇到的各种问题总结
  18. houdini节点大全中文手册_【技术贴】武林秘籍在此!大咖座谈虚幻引擎制作影视动画经验!...
  19. 图像处理中,在图片上写字,包括中文与英文!
  20. 日常科研使用Git指南

热门文章

  1. linux用户随机密码,Linux面试题-批量添加用户并设置8位随机密码
  2. 查看已安装的git版本
  3. PD,QC,VOOC快充是什么?基本概念
  4. RK3399平台开发系列讲解(PCI/PCI-E)5.52、PCIE RC侧设备树及配置
  5. linux端口复用隐藏后门
  6. 虚拟机制作iso镜像
  7. 上网需要在计算机上安装数据库管理软件吗,上网需要在计算机上安装什么软件...
  8. 条件覆盖,路径覆盖,语句覆盖,分支覆盖解释
  9. 【DSP】CCS6.1导入CCS3.3工程全过程以及“N个报错”的解决办法
  10. pandas之dropna()