一、问题描述

问题描述:在nn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题等价于在n*n的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。

算法设计:设计一个解n皇后问题的队列式分支限界法,计算在nn个方格上放置彼此不受攻击的n个皇后的一个放置方案。

*数据输入:由文件input.txt给出输入数据。第一行有1个正整数n。

*结果输出:将计算的彼此不受攻击的n个皇后的一个放置方案输出到文件output.txt。文件的第一行是n个皇后的放置方案。

输入文件:

input.txt

5

output.txt

1 3 5 2 4

二、问题分析
1.题目分析:

对于每一个放置点而言,它需要考虑四个方向上是否已经存在皇后。分别是行列,45度斜线和135度斜线。

行:每一行只放一个皇后,直到我们把最后一个皇后放到最后一行的合适位置,则算法结束。

列:列相同的约束条件,只需判断j是否相等即可。

45度斜线和135度斜线:约束条件——当前棋子和已放置好的棋子不能存在行数差的绝对值等于列数差的绝对值的情况,若存在则说明两个棋子在同一条斜线上

2.算法选择:

用分支限界法来解决n皇后问题。对于该问题它满足两种树结构。这里由于每一个合适的放置点出现最优解的概率是相等的,因此不需要使用优先队列。编译器提供了一个已经封装好的队列queue。

A.子集树。我们把行约束条件和其它约束条件放在一起,即认为每一行,棋子都有n个位置可以放置。于是它的空间结构如下:

假设n=3,这个图只画出了两层)

B.排列树。我们把行约束条件单独拿出来,也就是我们认为总共有八个皇后,这八个皇后必须都要放上去,但是放的位置不同,显然这是一个排列树。于是它的空间结构如下

这里由于我们还存在着其他的约束条件,并且行约束条件和这些条件完全可以放在一起,于是我就选择了相对容易理解的子集树作为解空间结构。

#include<iostream>
#include<queue>
#include<cmath>
#include<vector>
#include<fstream>
#include<sstream>
using namespace std;//定义一个节点类
struct Node{int number;vector<int>x;//保存当前解
}; //定义一个Queen的类
class Queen{friend int nQueen(int);public:bool Place(Node q,int n);void Research();int n;//皇后个数int *bestx;//最优解
}; //判断是否能够放置的函数
bool Queen::Place(Node q,int n)
{for(int j=1;j<n;j++)if((abs(n-j)==abs(q.x[j]-q.x[n]))||(q.x[j]==q.x[n])) return false;return true;
}void Queen::Research()
{queue<Node>Q;//活节点队列Node sign;sign.number=-1;Q.push(sign);//同层节点尾部标志int t=1;//当前节点所处的层Node Ew;//当前扩展节点 Ew.number=0; //搜索子集空间树while(1){    //检查所有的孩子节点 for(int k=1;k<=n;k++){//把当前扩展节点的值赋给下一个节点 Node q;q.number=t; q.x.push_back(0);//第一个位置为0 for(int i=1;i<t;i++) q.x.push_back(Ew.x[i]);q.x.push_back(k);if(Place(q,t))Q.push(q);}  //取下一扩展节点,取出,赋值给Ew Ew=Q.front();Q.pop();if(Ew.number==-1){//同层节点尾部标记t++;//进入下一层 Q.push(sign);//增加标记//继续往下去下一个节点 Ew=Q.front();Q.pop();}        if(Ew.number==n){//找到最后一层的节点 for(int i=0;i<=n;i++) bestx[i]=Ew.x[i];break;} }
}int nQueen(int n)
{Queen X;X.n=n;    X.bestx=new int[n+1];for(int i=0;i<=n;i++) X.bestx[i]=0;X.Research();for(int i=1;i<=n;i++){cout<<X.bestx[i]<<" ";}
}int main(){int N;cout<<"输入方格的行数:"; cin>>N;    cout<<"输出计算的彼此不受攻击的n个皇后的一个方案:"; nQueen(N);return 0;
}

算法设计与分析——分支限界法——n皇后问题相关推荐

  1. 算法设计与分析-分支限界法习题

    7-1 布线问题 印刷电路板将布线区域划分成 n×m 个方格阵列,要求确定连接方格阵列中的方格a 点到方格b 的最短布线方案.在布线时,电路只能沿直线布线,为了避免线路相交,已布了线的方格做了封锁标记 ...

  2. 算法设计与分析—分支限界法应用(头歌实验)

    第1关:装载问题 (FIFO 优先队列法) 问题描述 有一批共个集装箱要装上 2 艘载重量分别为 C1 和 C2 的轮船,其中集 装箱 i 的重量为 Wi ,且 装载问题要求确定是否有一个合理的装载方 ...

  3. 算法设计与分析——分支限界法

    文章目录 1. 分支界限法 1.1 基本思想 1.2 搜索策略 1.3 队列式 1.4* 优先队列式 2. 典型案例 2.1 装载问题 2.1.1 问题描述 2.1.2 约束函数和限界条件 2.1.3 ...

  4. 算法设计与分析——分支限界法——装载问题

    有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为Wi,且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船.如果有,找出一种装载方案. 容易证明:如果一个 ...

  5. 算法设计与分析之分支限界法

    文章目录 前言 一.分支限界法概述 二.分支限界法的基本思想 三.分支限界法的基本过程 四.常见的两种分支限界法 五.应用分支限界法应注意的关键问题 六.分支限界法示例 总结 前言 大家好,越努力,越 ...

  6. 算法设计与分析 课程设计之N皇后问题

    题目 N皇后回溯法求解空间 目的要求 目的: 1.用学到的书本知识解决实际问题的能力: 2.锻炼实际工作所需要的动手能力: 3.加强对数据结构和算法的应用: 4.锻炼自己以科学理论和工程上能力的技术, ...

  7. 国科大刘玉贵老师计算机算法设计与分析2021年期末考试题回顾

    总体感受 国科大研究生的计算机算法设计与分析课程有三位老师教授,分别是卜东波老师.陈玉福老师 和刘玉贵老师,这三位老师上课各有特色和风格.我选择的是刘玉贵老师的课程. 这门课程的内容挺充足的,但是有个 ...

  8. 计算机算法设计与分析教学大纲,算法设计与分析的教与学(教学大纲)

    原标题:算法设计与分析的教与学(教学大纲) 课程代码:**** 课程负责人: **** 课程中文名称:算法设计与分析 课程英文名称:Designand Analysis of Algorithms 课 ...

  9. 算法设计与分析--期末复习重点总结

    目录 一.算法概述 1.算法的定义与特性 2.数学证明法 3.算法复杂性分析方法 4.渐进分析 二.递归与分治策略 1.递归概念 2.递归算法设计示例 3.递归算法分析 4.分治基本思想 5.分治算法 ...

最新文章

  1. nexus搭建maven私服
  2. SQL备份与恢复之备份类型和选项
  3. tp 扫码点餐 源码_同城跑腿系统小程序源码搭建平台模式案例
  4. 强制修改mysql 中root的密码
  5. 美利好车的微服务实践
  6. PHPStorm IDE 快捷键
  7. CCSpriteBatchNode的使用
  8. python 中的短路逻辑是什么?
  9. 单机搭建Android开发环境(五)
  10. mapreduce 算法_MapReduce算法–了解数据联接第1部分
  11. 让 Android WebView 支持文件下载的三种解决方案
  12. ACM POJ 2965 The Pilots Brothers' refrigerator
  13. 创业者应该思考智能硬件能为灾难做什么
  14. 正确的使用URLClassLoader--ClassNotFoundException: com.mathworks.toolbox.javabuilder.internal.MWComponentI
  15. Ubuntu 16.04 安装搜狗输入法
  16. Facebook 数字货币:缘起、意义和后果
  17. h5禁止页面长按操作_解决HTML5对手机页面长按会粘贴复制禁用的方法-H5教程
  18. 坐标测量机的定位误差和测长不确定度有何区别,如何表示?
  19. vit transformer中的cls_token
  20. 计算机开机按f1,开机要按F1怎么解决?电脑开机不按F1进去系统的方法

热门文章

  1. powershell /遍历/psobject/字符串转换Json/json数组操作
  2. 汉诺塔c语言源程序步骤,汉诺塔问题的算法分析及C语言演示程序的实现
  3. 用python快速合并代码(方便软著申请)
  4. 【数据库原理及应用】经典题库附答案(14章全)——第十二章:数据库技术新发展
  5. Python 3.6出现报错解决方案:No Python 3.6 installation was detected,无法卸载Python
  6. ArcGIS实验教程——实验三:矢量数据采集与编辑(矢量化)
  7. Android Studio之查找当前类的位置图标没了
  8. 数据结构之广度优先搜索(队列实现)问题
  9. 除掉字符串里面相同的字符
  10. 赶紧3分钟学完15分钟的内容我要出去玩(8)