1. /*
  2. * 八皇后问题回溯法编程练习
  3. * 在8×8的棋盘上,放置8个皇后,两个皇后之间不能两两攻击
  4. * 也即,直线,垂直45度、135度方向不能出现两个皇后
  5. *
  6. * copyright Michael 2014-12-19
  7. * QQ 1192065414
  8. **/
  9.  
  10. #include <iostream>
  11. #include <stack>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. using namespace std;
  15.  
  16. struct Sposition
  17. {
  18. int iRow;
  19. int iColumn;
  20. };
  21.  
  22. /*
  23. * 保存结果使用的栈
  24. **/
  25. stack<Sposition> ResultStack;
  26.  
  27. /*
  28. * 推断在水平方向x,垂直方向y,能否够放置新皇后
  29. **/
  30. bool JudgeIsAcceptable(int x ,int y)
  31. {
  32. struct Sposition pos;
  33.  
  34. stack<Sposition> resultS(ResultStack);
  35. int stackSize = resultS.size();
  36. for ( ; stackSize > 0 ; --stackSize )
  37. {
  38. pos = resultS.top();
  39. if( pos.iRow == x ) //推断同一直线上是否已经有皇后
  40. {
  41. return false;
  42. }
  43.  
  44. if( (x-pos.iRow) == (y-pos.iColumn) ) //推断45度角是否已经有皇后
  45. {
  46. return false;
  47. }
  48.  
  49. if( (x-pos.iRow) == (pos.iColumn-y) ) //推断-45度角是否已经有皇后
  50. {
  51. return false;
  52. }
  53.  
  54. resultS.pop();
  55. }
  56.  
  57. return true;
  58. }
  59.  
  60. /*
  61. * 皇后放置算法
  62. * 0 0 0...
  63. * 0 0 0...
  64. * 0 0 0...
  65. * ......
  66. * 遍历第0列,取第0列的第一个、第二个...
  67. * 从第1列開始尝试,然后尝试第2列,当尝试到一列,8行都不能放置皇后,则回溯。返回前一列的下一行继续尝试
  68. **/
  69. void SolveQueue()
  70. {
  71. Sposition pos;
  72. for (int i = 0 ; i < 8 ; ++i )
  73. {
  74. //The first line of the queue
  75. pos.iRow = i;
  76. pos.iColumn = 0;
  77. ResultStack.push(pos);
  78.  
  79. int x = 0; //标记当前行。0~7行
  80. int y = 1; //标记当前列。0~7列
  81. while( y<8 ) //从第一列開始
  82. {
  83. for ( ; x < 8 ; ++x ) //从第0行開始探索
  84. {
  85. if ( JudgeIsAcceptable(x,y) )
  86. {
  87. pos.iRow = x;
  88. pos.iColumn = y;
  89. ResultStack.push(pos);
  90.  
  91. //放置完毕。输出结果
  92. if ( 8 == ResultStack.size() )
  93. {
  94. while ( !ResultStack.empty() )
  95. {
  96. pos = ResultStack.top();
  97. cout<<pos.iRow<<"\t"<<pos.iColumn<<endl;
  98. ResultStack.pop();
  99. }
  100. }
  101. x = 0; //这一列放置完毕,继续下一列放置
  102. break;
  103. }
  104. }
  105.  
  106. if ( 8 == x ) //这一列。8行都不能放置皇后,回溯到上一列的下一行
  107. {
  108. pos = ResultStack.top();
  109. x = pos.iRow+1;
  110. if ( 8 <= x )
  111. {
  112. y = y-2; //假设上一列放置的地方已经是最后一列。则无需继续尝试,应该回溯两列。从前两列继续尝试
  113. ResultStack.pop();
  114. pos = ResultStack.top();
  115. x = pos.iRow+1;
  116. }
  117. else
  118. {
  119. --y; //回溯到前一列的下一行继续尝试
  120. }
  121. ResultStack.pop();
  122. continue; //控制列数,不进行 ++y 操作
  123. }
  124.  
  125. ++y;;
  126. }
  127.  
  128. if ( (8 == y) && (ResultStack.size() != 8) ) //假设8行已经尝试完,可是放置不够8行,出错状态。处理下一种可能性
  129. {
  130. while ( !ResultStack.empty() )
  131. {
  132. ResultStack.pop();
  133. }
  134. }
  135.  
  136. cout<<endl;
  137. cout<<endl;
  138. }
  139. }
  140.  
  141. int main()
  142. {
  143. SolveQueue();
  144. }

8皇后-----回溯法C++编程练习的更多相关文章

  1. js实现八皇后,回溯法

    八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决. 从第一行选个位置开始放棋 ...

  2. 回溯法解决N皇后问题(以四皇后为例)

    以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...

  3. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  4. 实现n皇后问题(回溯法)

    /*======================================== 功能:实现n皇后问题,这里实现4皇后问题 算法:回溯法 ============================= ...

  5. HDU 2553 n皇后问题(回溯法)

     DFS Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description ...

  6. 八皇后问题-回溯法(MATLAB)

    原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...

  7. 算法——八皇后问题(eight queen puzzle)之回溯法求解

    八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...

  8. 回溯法求解n皇后和迷宫问题

    回溯法是一种搜索算法,从某一起点出发按一定规则探索,当试探不符合条件时则返回上一步重新探索,直到搜索出所求的路径. 回溯法所求的解可以看做解向量(n皇后坐标组成的向量,迷宫路径点组成的向量等),所有解 ...

  9. USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)

    Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...

随机推荐

  1. delphi 自我删除和线程池(1000行代码,需要仔细研究)

    unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  2. pv操作 生产者消费者

    #include <iostream> #include <stdlib.h> #include <pthread.h> #include <semaphor ...

  3. 创建android画笔程序的样例(有镜面效果)

    先上图: 关键是在检測到手指移动的时候用mPath.quadTo的方法,android sdk解释是: Add a quadratic bezier from the last point, appr ...

  4. 那些年我们装过的数据库---盘点sqlserver2008安装时遇到的各种的问题(持续更新中)

    给自己安过sqlServer2008,也给好多同学安过sqlServer2008,期间遇到了好多不同的另人心烦的问题,在这里整理一下,(涉及到的部分方法是在网上找的,有些也没试过,仅仅是在这里整理一下 ...

  5. 上Https 和 http 差分

    HTTPS 和 HTTP 差协议 超文本传输协定HTTP 对于web 浏览器和现场服务之间传递消息,HTTP 以纯文本协议 发送内容 无论不提供数据加密方法 假设拦截攻击web 浏览器和网站serve ...

  6. git/github初级运用自如 (转)

    三 . 设置用户信息 这一步不是很重要,貌似不设置也行,但github官方步骤中有,所以这里也提一下. 在git中设置用户名,邮箱 $ git config --global user.name &q ...

  7. PVPlayer的实现方式

    关于opencore下多媒体播放,在mediaserver进程里面仅仅有一行代码: MediaPlayerService::instantiate(); 这行代码的作用是初始化一个MediaPlaye ...

  8. UVa 10188 - Automated Judge Script

    题目:给你一些题目的输出结果,推断是AC,PE还是WA. 分析:模拟. 依照题意模拟就可以,注意PE条件为全部数字字符出现顺序同样就可以. 说明:想起非常多年前写的OJ的后台判题程序了╮(╯▽╰)╭. ...

  9. 基于TFTP协议的远程升级设计

    说明:因为CSDN博客编辑器对word格式近乎不支持.因此对表格使用了图片方式(最后一个表格未使用图片格式.大家能够看看效果),CSDN博客编辑器上传图片十分不人性化(直接复制图片是不显示的),因此本 ...

  10. 为什么使用 React? Edit on GitHub

    为什么使用 React? React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库.很人多认为 React 是 MVC 中的 V(视图). 我们创造 ...