八皇后

Qt版八皇后demo 这是一个Qt八皇后的demo演示样例,由于用界面呈现,所以比较容易看出算法得到的结果是否正确,详细关于解法的分析可以参看http://blog.youkuaiyun.com/satanzw/article/details/8106409 立即下载

问题描述:八皇后问题是把八个皇后放到8*8的棋盘中,使它们不会相互攻击。根据国际象棋规定,皇后可以吃掉和它同行、同列或同一斜线上的任意一个棋子。现要求求出所有可能的解。


解决思路:

       首先把第一个皇后放到棋盘中,再放第二个皇后,使它不会和第一个皇后冲突,再放第三个皇后,依次类推...

为了得到所有的解,我们必须通过循环遍历所有的可能的方案。

       根据已知条件每一行(列)有且仅有一个皇后,所以我仅需要定义一个一维数组q[n],其中n表示行号和皇后编号,数组元素表示列号(从0开始)。例如q[3] = 5,表示第3个皇后(从0开始)被安排的位置是(3, 5)。这样可以便于我们判断皇后的位置是否冲突,所谓的冲突,即该位置的同一行、同一列或同一斜线上已存在了一个皇后。假设现在安排的皇后q[3]=5要判断是否有冲突,我们仅需要判断与q[0-2]是否有列或斜方向上的冲突(行方向无需判断,因为我们定义的是一维数组,行号等于皇后号,也就是说每一行只会对应唯一的皇后),列方向有冲突的条件是q[n] == q[i],斜方向冲突的条件是| q[n] - q[i] | == | n-i |,这样判断较简洁。


TIP:如果点A(x,  y),点B(x1, y1)满足|x - x1| = |y - y1|,则A,B在同一斜方向上


描述如下:

Queen(n)

     for 同一行上的每个位置

        先尝试将第n个皇后放入该位置

        if 和之前已放入的皇后没有冲突

            if(n == 8) 输出该方案

            else Queen(n+1)

End Queen

C++代码:

/**
 * @file EightQueen.cpp
 * @Synopsis 根据已知条件每一行有且仅有一个皇后,所以这里定义一个数组q[MAX],
 *           下标表示行号和皇后编号,数组元素表示列号(从0开始) 
 * @author weih.cao
 * @version 
 * @date 2014-08-19
 */

#include <iostream>
#include <stdlib.h>
using namespace std;

#define MAX 8    //MAX表示皇后最大个数,仅当max = 1 或 max >= 4 时才有解
int q[MAX];                      
int num = 0;

void print()
{
    for(int i = 0; i < MAX; ++i)
    {
        cout << q[i] << " ";
    }
    cout << endl;
}

/* ****************************************************************************/
/**
 * @Synopsis  isDanger 判断新插入的皇后是否与已存在的皇后冲突
 *
 * @Param n表示最新进来的皇后的编号
 *
 * @Returns  有冲突返回true,否则返回false 
 */
/* ****************************************************************************/
bool isDanger(int n)
{
    for(int i = 0; i < n; ++i)
    {
        if(q[n] == q[i] || abs(q[i] - q[n]) == n - i)
            return true;
    }
    return false;
}


/* ****************************************************************************/
/**
 * @Synopsis  queen 安排第n个皇后的位置
 *
 * @Param n表示第几个皇后
 */
/* ****************************************************************************/
void queen(int n)
{
    for(int i = 0; i < MAX; ++i)    // 遍历一列中的每一个位置
    {
        q[n] = i;                   // 先尝试将第n个皇后放入该位置
        if(!isDanger(n))            // 判断该位置是否有危险,如果有危险就尝试下一个位置,
                                    // 否则就安排下一个皇后或输出结果(每个皇后都安排了位置则输出该方案)
        {
            if(n == MAX -1)
            {
                print();            // 打印方案
                ++num;
            }
            else
            {
                queen(n + 1);      // 安排下一个皇后
            }
        }
    }
}

int main()
{
    queen(0);                       //从第0个位置开始安排皇后
    cout << "total: " << num << endl;
}


Qt实现N皇后算法 利用Qt实现N皇后算法,可以单步显示每次的结果。 立即下载

相关推荐

unity 腾讯地图sdk移动和缩放代码

unity 腾讯地图sdk 实现移动端 缩放 和 移动

。。。。。 1283

八皇后问题

题目:经典的八皇后问题,即在一个8*8的棋盘上放8个皇后,使得这8个皇后无法互相攻击( 任意2个皇后不能处于同一行,同一列或是对角线上),输出所有可能的摆放情况。 解题思路: 我们用一个一维数组来表示相应行对应的列,比如c[i]=j表示, 第i行的皇后放在第j列。如果当前行是r,皇后放在哪一列呢?c[r]行一共有8列,所以我们要让c[r]依次取第0列,第1列,第2列……一直到第7列,

acm_JL的博客 2523

Python数据分析案例——宏观经济指标与沪深指数实证研究分析

沪深300指数与宏观经济指标关联性研究:2015-2024实证分析 摘要:本文基于2015-2024年月度数据,采用多元回归方法分析宏观经济指标对沪深300指数的影响。研究发现,市场情绪(SEN)、美国利率(STY)、美元指数(DXY)、狭义货币供应量(M1)和CPI对指数具有显著解释力(P<0.05),而GDP、LPR等传统指标影响不显著。模型解释力达62%(R²=0.62),表明A股短期走势更受资金流动、投资者心理和国际金融条件驱动。研究为投资者提供了除基本面外的市场预判指标,建议关注M1增速、美

weixin_50902344的博客 1404

八皇后问题汇总(C++版)

这就是著名的八皇后问题。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。首先,如果每一次都去进行深搜的话一定会出现超时问题,所以最好的办法是先进行一次深搜,然后在深搜的过程中存储每一种方案,这样在进行输出是只需要从保存的方案中拿出来就可以了,时间复杂度为O(1)。8]表示皇后的放置:第i行皇后放在第j列,用a[i]=j来表示,即下标是行数,内容是列数。如果在/斜线上,则行列值之和相同,如果在\斜线上,则行列值之差相同。

小芒果的博客 1万+

2024从零开始使用VSCode编程(静态页面制作篇)HTML+CSS+JS阶段

VSCode第一个前端静态页面的编写

ssrsrrn的博客 9591

【分享】获取微信通讯录python代码形式实现

微信号”, “昵称”, “地区”, “备注”, “标签”, “签名”, “来源”5. 找到最后一个空格所在的位置(后一个就是真正的联系人了)当前微信号与上一个相同的时候,说明到底部了,可以跳出循环。3. 滚动鼠标到最顶部(防止已经滚动了一部分了)7.记录下上一个联系人的微信号。7. 无限循环按键盘下箭头。获取详情中的以下元素内容。6. 点击第一个联系人。4. 获取联系人列表。

程序员老狼专注开发aigc或客服系统应用 2894

八皇后问题——递归+回溯法

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。 求解过程:     采用遍历的办法,就是

laoniu_c的专栏 2021

PG-FP6编程器错误代码解析与高效排障实战指南

在嵌入式系统开发与量产烧录中,编程器是连接开发环境与目标硬件的重要桥梁。其工作原理是通过特定的通信协议(如UART、SWD)与微控制器(MCU)建立连接,完成程序代码的写入、擦除与校验。这项技术的核心价值在于确保固件能够准确、可靠地部署到硬件中,是产品从原型到量产的关键环节。在实际的工程实践中,尤其是在使用瑞萨(Renesas)PG-FP6这类编程器进行调试或批量生产时,工程师常会遇到各种通信失败、编程验证错误或电源异常等问题,这些问题往往以特定的错误代码形式呈现。深入理解这些错误代码背后的硬件连接、电源时

weixin_34387468的博客 580

[C++实现]八皇后问题

所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......   如果某一层看遍了所有格子,都无法成功摆放,则回溯到上一个皇后,让上一个皇后右移一格,再进行递归。如果八个皇后都摆放完毕且符合规则,那么就得到了其中一种正确的解法。说起来有些抽象,我们来看一看递归回溯的详细过程。

m0_71229255的博客 3709

Android NDK/JNI面试题大全及参考答案(3万字长文)

是一套工具集合,它允许开发者为Android平台编写原生应用程序或者应用程序的部分模块。NDK 主要用于开发那些需要高性能计算的应用程序,例如游戏引擎、图像处理软件或音频/视频编码解码器等。通过使用 C 或 C++ 编写代码,开发者可以利用硬件加速功能,提高应用性能。NDK 提供了一系列工具来帮助开发者完成从源代码到可执行文件的整个过程,包括编译、链接、调试等功能。

大模型大数据攻城狮的专栏 1257

芒果YOLOv12改进13:独家原创改进最新 CFNet 核心结构|即插即用 | 首发改进显著提升检测性能,小目标检测涨点必备

芒果YOLOv12改进13:独家原创改进最新 CFNet 核心结构|即插即用 | 首发改进显著提升检测性能,小目标检测涨点必备

包括YOLOv5、YOLOv7、YOLOv8等模型改进 289

深入浅出讲解八皇后&n皇后问题

深入浅出讲解八皇后和n皇后问题规则分析第一种方式:问题分析代码如下1.0代码如下1.1第二种方式:代码如下1.2代码如下1.3 这次朋友想看,有是事解释讲解部分下次细说 该文章会从简单的程序开始讲解,也会涉及到一些算法(递归、回溯)、数据结构等一些知识,最后的程序是我现在为止想到的最优算法,讲解过程就是问题思考的过程 规则分析 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都...

weixin_43884534的博客 1066

推理篇第3节:TensorRT基础——Builder、Engine、ExecutionContext生命周期

TensorRT模型优化与推理流程摘要 TensorRT是NVIDIA的深度学习推理优化器,通过Builder、Engine和ExecutionContext三阶段实现高效推理。Builder负责编译模型,执行图优化和kernel选择;Engine是优化后的推理计划;ExecutionContext管理运行时执行。编译期进行重量级优化(如算子融合、kernel调优),运行时快速执行。TensorRT 10.x引入新API,推荐使用buildSerialized方法。构建流程包括创建Builder、网络定义、

PeterPan的博客 503

八皇后12种本质不同的解

在八皇后的92种解中有大量的解是本质重复的 可以通过左右对称,上下对称,对角线对称,旋转来互相转化 只有十二种解是本质不同的。 #include<stdio.h> int w=1; int check(int m); void put(void); int check3(void); int check2(void); void firstdiagonal(); void seconddiagonal(); void updown(); void leftright(); void Queen(

qq_51741975的博客 2430

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python八皇后游戏

【代码】python八皇后游戏。

qq_40753021的博客 567

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JAVA八皇后与黑白皇后

因为一行只能放一个皇后 所以dfs传入的x(正在放第几个就可以作为传入的当前行)任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇。给定一个n×n的棋盘,现在要向棋盘中放入n个黑皇后和n个白皇后,使。一次dfs在一行同时放黑皇后和白皇后会比较复杂。我们先放完黑皇后再去放白皇后。可以记一下对角线的判定。问总共有多少种放法?

weixin_74234462的博客 263

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

N皇后 八皇后 位运算解法

位运算 八皇后 N皇后 问题描述 什么是八皇后? 题目链接 N皇后 解法 ​ 直接在N*N的棋盘上进行深搜,试探着下棋,也就是回溯法。 ​ 对于一个皇后来说,我们需要判断她的 八个方向 ,即 主对角线,副对角线,行,列 ​ 1. 确定状态 ​ 第一眼的感觉是要用 四个数组来储存情况,但实际上只需要三个 ,把 行 排除在外 ​ 因为每次搜索的时候,都自动按行搜索,也就是变量 row ,每改变一次,代...

weixin_34356555的博客 278

八皇后及N皇后的回溯与递归算法

八皇后及N皇后的回溯与递归算法 // 8 queens #include int position[9]; // 第i个皇后的列号是position[i] (i:1-8) int check(int step){ int i; if(position[step]>8) return 0; for(i=1; i<step; i++){ if (

奋起的Coder。。。 1971

2024.12.07 n皇后 & 八皇后本质解

后续数字序列表示八皇后所在位置,数值本身表示某个皇后在棋盘上的行坐标,该数值所在位置表示该皇后的列坐标(>0),例如,数字5位于序列的第2位,表示棋盘上第5行第2列有一个皇后;数字4位于序列的第8位,表示棋盘上第4行第8列有一个皇后,由此,这8个数字描述了一种棋局。如果去除其中上下对称、左右对称棋局、主副对角线对称棋局和旋转后重复棋局,则有12种完全不同的棋局。例如,第一行输出 No1:1 5 8 6 3 7 2 4(冒号为西文冒号且前后无多余字符,冒号后的每个数字后均有一个西文空格),

2401_85766506的博客 492

八皇后算法

//八皇后代码include

u012821276的专栏 236

八皇后进阶之2n皇后

题目 1460: 蓝桥杯基础练习VIP-2n皇后问题 时间限制: 2s内存限制: 192MB提交: 3598 解决: 1781 题目描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。 输入格式 输入的第一行为一个整数n,表示棋盘的大小。 n小于等于8 接下来n行,每行n个0或1的整数,如果一个整数为

2301_80221401的博客 465

蓝桥杯Day9学习——八皇后我终于是懂了

二分一道、八皇后+同DFS基础题、BFS基础。

2303_79931170的博客 841

C#写八皇后

C#写八皇后 引言 刚开始接触到C#是因为想要用Unity自己做游戏 ,把脑海里的创意落到屏幕前。 而所有的Unity教程里都是从C#起步,所以就想好好学门C# 任务 这是老师布置的作业: 2.3 在8X8格的国际象棋棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。请输出尽可能多的摆法。 环境 Visual stdio 2019 思路 为了对棋盘的布局有个清晰地了解,我们可以这样想:任意两个皇后不能在同一行,那么就说明一行放一个皇后,那么只要找到每行的皇后分别放在

hanhandeguajian的博客 526

八皇后本质不同的解

8皇后本质不同的解 代码是自己写的,思路写在代码下方,希望可以和大家讨论~ 题目名称:八皇后本质不同的解 题目描述: 如上题所述,当N=8时,一共有92种可能。如果去除其中上下对称、左右对称棋局、主副对角线对称棋局和旋转后重复棋局,则有12种完全不同的棋局。编写程序,输出这12种棋局。 输入: 无 输出: 共12行,每行输出1种棋局, 例如,第一行输出 No1:1 5 8 6 3 7 2 4(冒号为西文冒号且前后无多余字符,冒号后的每个数字后均有一个西文空格), 其中No1 表示这是第1种棋局;后续数字序列

u010656213的博客 2291

皇后问题最快的解法(C语言)八皇后、十六皇后时间在毫秒级

//皇后问题最快的解法(C语言)八皇后、十六皇后时间在毫秒级 #include # include # include # include #define O 134775813 // TODO (xubo18056052430#1#): PB10210016 徐波 LARGE_INTEGER lv,lv1,lv2,lv3,lv4; double totaltime,secondsPer

Keep Learning 4024
上一篇: 汉诺塔递归求解
下一篇: 15道使用频率极高的基础算法题
devil_pull
博客等级 码龄15年 12粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值