/*
* 八皇后问题回溯法编程练习
* 在8×8的棋盘上,放置8个皇后,两个皇后之间不能两两攻击
* 也即,直线,垂直45度、135度方向不能出现两个皇后
*
* copyright Michael 2014-12-19
* QQ 1192065414
**/ #include <iostream>
#include <stack>
#include <stdlib.h>
#include <string.h>
using namespace std; struct Sposition
{
int iRow;
int iColumn;
}; /*
* 保存结果使用的栈
**/
stack<Sposition> ResultStack; /*
* 推断在水平方向x,垂直方向y,能否够放置新皇后
**/
bool JudgeIsAcceptable(int x ,int y)
{
struct Sposition pos; stack<Sposition> resultS(ResultStack);
int stackSize = resultS.size();
for ( ; stackSize > 0 ; --stackSize )
{
pos = resultS.top();
if( pos.iRow == x ) //推断同一直线上是否已经有皇后
{
return false;
} if( (x-pos.iRow) == (y-pos.iColumn) ) //推断45度角是否已经有皇后
{
return false;
} if( (x-pos.iRow) == (pos.iColumn-y) ) //推断-45度角是否已经有皇后
{
return false;
} resultS.pop();
} return true;
} /*
* 皇后放置算法
* 0 0 0...
* 0 0 0...
* 0 0 0...
* ......
* 遍历第0列,取第0列的第一个、第二个...
* 从第1列開始尝试,然后尝试第2列,当尝试到一列,8行都不能放置皇后,则回溯。返回前一列的下一行继续尝试
**/
void SolveQueue()
{
Sposition pos;
for (int i = 0 ; i < 8 ; ++i )
{
//The first line of the queue
pos.iRow = i;
pos.iColumn = 0;
ResultStack.push(pos); int x = 0; //标记当前行。0~7行
int y = 1; //标记当前列。0~7列
while( y<8 ) //从第一列開始
{
for ( ; x < 8 ; ++x ) //从第0行開始探索
{
if ( JudgeIsAcceptable(x,y) )
{
pos.iRow = x;
pos.iColumn = y;
ResultStack.push(pos); //放置完毕。输出结果
if ( 8 == ResultStack.size() )
{
while ( !ResultStack.empty() )
{
pos = ResultStack.top();
cout<<pos.iRow<<"\t"<<pos.iColumn<<endl;
ResultStack.pop();
}
}
x = 0; //这一列放置完毕,继续下一列放置
break;
}
} if ( 8 == x ) //这一列。8行都不能放置皇后,回溯到上一列的下一行
{
pos = ResultStack.top();
x = pos.iRow+1;
if ( 8 <= x )
{
y = y-2; //假设上一列放置的地方已经是最后一列。则无需继续尝试,应该回溯两列。从前两列继续尝试
ResultStack.pop();
pos = ResultStack.top();
x = pos.iRow+1;
}
else
{
--y; //回溯到前一列的下一行继续尝试
}
ResultStack.pop();
continue; //控制列数,不进行 ++y 操作
} ++y;;
} if ( (8 == y) && (ResultStack.size() != 8) ) //假设8行已经尝试完,可是放置不够8行,出错状态。处理下一种可能性
{
while ( !ResultStack.empty() )
{
ResultStack.pop();
}
} cout<<endl;
cout<<endl;
}
} int main()
{
SolveQueue();
}

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. 用gradle管理android项目出现的问题以及解决方法

    1.项目结构 最好是全部在root 项目配置 一个settings.gradle 一个build.gradle 2.多项目依赖 http://www.gradle.org/docs/current/u ...

  2. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 站点设置

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 站点设置         你应该熟悉(假设还咩有)的SharePo ...

  3. File already exists: filesystem '/path/file', transaction svn常见错误解决方法

    前言 多人任务基本都会用到SVN,于是提交的时候如果不先更新在提交或者操作顺序不对,会经常出现错误,其中File already exists: filesystem这个就是个常见问题,上网找了半天没 ...

  4. hdu 2642 二维树状数组 单点更新区间查询 模板水题

    Stars Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/65536 K (Java/Others) Total Subm ...

  5. 读懂Java中的Socket编程(转)

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  6. hdu 4710 Balls Rearrangement (数学思维)

    意甲冠军:那是,  从数0-n小球进入相应的i%a箱号.然后买一个新的盒子. 今天的总合伙人b一个盒子,Bob试图把球i%b箱号. 求复位的最小成本. 每次移动的花费为y - x ,即移动前后盒子编号 ...

  7. SESC中的热量模拟器

    SESC安装见前文 配置sesc支持热量模拟 ../sesc/configure --enable-power --enable-therm make 遇到问题: 1 找不到 liblevmar.a ...

  8. SE 2014年4月8日

    1.路由引入的作用? 当网络中运行多种路由协议的时候,由于不同协议的路由算法和度量值等均不相同,路由引入可以将不同协议的路由引入到当前的路由协议中,保证网络的互通. 对比单向入和双向入 单向引入是只将 ...

  9. grails的controller和action那点事---远程调试groovy代码

    最近由于项目需要,用到了grails,这玩意确实好用,生产率高有类型python的速度与简洁.仅第一印象,用的还不深入,说的不对请轻拍. 遇到的几个问题: 1. groovy远程调试 玩Java的应该 ...

  10. HTML5游戏开发进阶指南

    <HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.)    译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...