//核心代码如下
//Queen--放置皇后 #include "queue.h" queue::queue()
{
const int maxn = *;
this->QN = ;
this->board = new bool[maxn];
for (int i = ; i < maxn; i++) {
this->board[i] = false;
}
this->judgeRecursion = true;
this->count = ;
} queue::queue(int N)
{
const int maxn = ;
if (N > || N < )
this->QN = ; //如果不合法就正规化棋盘
else
this->QN = N;
this->board = new bool[maxn];
for (int i = ; i < maxn; ++i) //初始化棋盘,未放置棋子的棋盘设置为false
this->board[i] = false;
this->judgeRecursion = true;
this->count = ;
} bool queue::available (const int Crow, const int Ccol) const //当前行,当前列
{
for (int hor = ; hor < Crow; ++hor) {
//纵向查找
if (board[hor * QN + Ccol]) //已经放置皇后的棋盘处为true
return false; //则返回false--放置不合法
}
int obli = Crow, oblj = Ccol;
while (obli > && oblj > ) {
if (board[(--obli) * QN + (--oblj)])
return false; //左斜上查找
}
obli = Crow, oblj = Ccol;
while (obli > && oblj < QN - ) {
if (board[(--obli) * QN + (++oblj)])
return false; //右斜上查找
}
return true; //都没有,则该位置可以放置皇后
} //打印棋盘
void queue::show (bool *Q)
{
const int maxn = ;
for (int i = ; i < maxn; i++)
Q[i] = this->board[i];
} //重新初始化棋盘
void queue::reset ()
{
const int maxn = ;
for (int i = ; i < maxn; i++)
this->board[i] = false;
this->judgeRecursion = true;
this->count = ;
} void queue::reset (int N)
{
const int maxn = ;
if (N < || N > ) this->QN = ;
else
this->QN = N; for (int i = ; i < maxn; i++)
this->board[i] = false;
this->judgeRecursion = true;
this->count = ;
} queue::~queue ()
{
delete []board;
board = nullptr;
} /**
* @brief queue::answer --- 放置皇后
* @param solu --- 求解的方法数
* @param Crow --- 当前的行数
* @param Q --- 棋盘,用来打印
*/
void queue::answer (int solu, int cur, bool *Q)
{
if (!judgeRecursion) //递归结束,中断
return;
if (cur == QN) { //当前行到最后一行,则一种方案结束
count++;
if (count == solu) { //递归到第solu方案时停止
this->show (Q);
judgeRecursion = false; //停止递归
return;
}
return;
}
else
{
for (int col = ; col < QN; col++)
{
if (available (cur, col)) //检查当前行,列
{
board[cur * QN + col] = true; //合法则放置皇后
answer (solu, cur + , Q); //递归下一行
//如果回溯法中使用了辅助的全局变量,则一定要及时把它们恢复原状.
//特别的,若函数有多个出口,则需在每个出口处恢复被修改的值
board[cur * QN + col] = false;
}
}
}
}

源代码下载地址:链接:https://pan.baidu.com/s/12BTDR8pRMvxpKYNFb988EQ 密码:yk0o

八皇后问题动态演示_Qt5实现的更多相关文章

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

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

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

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

  3. 八皇后问题——列出所有的解,可推至N皇后

    <数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...

  4. 题目---汉诺塔及AI代码及八皇后

    2019春第十一周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering ...

  5. 八皇后算法的另一种实现(c#版本)

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

  6. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  7. [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)

    [Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...

  8. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  9. Python解决八皇后问题

    最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...

随机推荐

  1. Docker Clustering Tools Compared: Kubernetes vs Docker Swarm

    https://technologyconversations.com/2015/11/04/docker-clustering-tools-compared-kubernetes-vs-docker ...

  2. Hacked VisualSVN Server by PHP to allow user change password

    index.php <?php$username = $_SERVER["PHP_AUTH_USER"]; //经过 AuthType Basic 认证的用户名$authed ...

  3. [转]ubuntu ssh登陆显示系统信息

    Welcome to Ubuntu LTS (GNU/Linux --generic i686) * Documentation: https://help.ubuntu.com/ System in ...

  4. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 6. 条件

    前面的教程中,我们已经可以让小海龟绘制出各种图形了.但是,所有绘图的代码都是预先编好的,程序一旦运行起来,运行结果(绘制的图形)就是固定不变的.这一节中,咪博士将教大家如何让海龟响应用户的输入. im ...

  5. Java微信二次开发(八)

    高级接口,先做了两个(获取用户信息和获取关注者列表) 第一步:找到包com.wtz.vo,新建类UserInfo.java package com.wtz.vo; /** * @author wang ...

  6. loadrunner基础学习笔记七-面向目标场景

    部署应用程序之前,要执行验收测试以确保系统能够承担预期的实际工作量. 可以为想要生成的每秒点击次数,每秒事务数或事务响应时间设置目标 loadrunner将使用面向目标的场景自动生成所需的目标,当应用 ...

  7. C# PictureBox控件畫圖

    PictureBox的正方向: BitMap初始化: Bitmap bt = new Bitmap(Width,Height);      Graphics gdi = Graphics.FromIm ...

  8. Tunnel Warfare HDU - 1540(线段树最长连续区间)

    题意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点.   解析: 线段树结点 设置一个  lq记录区间左端点开始的最大连续个数,  rq ...

  9. LightOJ - 1074 Extended Traffic(标记负环)

    题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市u到另一个城市v的时间为:(au-av)^3,存在负环.问从第一个城市到达第k个城市所话的时间,如果不能到达,或者时间小于3输出?否则输出所花的 ...

  10. day31 configparser 配置文件模块

    #__author__: Administrator #__date__: 2018/8/8 # configparse 生成配置文件,配置文会以件.ini结尾 # 对于格式有要求 # 创建配置文档 ...