【算法】 N皇后问题

回溯算法经典案例 1 ——N皇后 Java 问题分析 N 皇后问题研究的是如何将 N 个皇后放置在 N×N 的棋盘上,并且使皇后彼此之间不能相互攻击。 皇后的走法是:可以横直斜走,格数不限。因此要求皇后彼此之间不能相互攻击,等价于要求任何两个皇后都不能在同一行、同一列以及同一条斜线上。 直观的做法是暴力枚举将 N 个皇后放置在 N×N 的棋盘上的所有可能的情况,并对每一种情况判断是否满足皇后彼此之间不相互攻击。暴力枚举的时间复杂度是非常高的,因此必须利用限制条件加以优化。 显然,每个皇后必须位于不同行和不同列,因此将 N个皇后放置在 N×N 阅读详情

AcWing原题链接:n-皇后问题

算法思路

根据之前写过的数的排列的深度优先搜索dfs的思想,将path[]看作是每一行放置皇后的位置,每次在一行中找到一个合法的皇后的位置,便进行下一次递归:dfs(u + 1),这就是找到了一个皇后的位置。
而判断该位置是否合法的条件是:在当前递归所处的行数中,遍历每一列的棋格,正在遍历的这一格的数列、对角线、反对角线都没有皇后。
用col[N]表示这一列有无queen
dg[N]表示这一格的对角线上有无queen
udg[N]表示这一格的反对角线上有无queen
合法条件因此为:!col[i] && !dg[u + i] && !udg[u - i + n]
因为是根据竖列进行递归的,所以每一横行都只有一个queen,就不用判断这一排有无queen了
对角线和反对角线的理解有两种:
1. 好理解一点的就是越往右下,i和u都增大
越往左下,i减小,u增大,+n是为了防止下标出现负数
2. 另一种理解方式是通过直角坐标系的截距进行理解:
row = -col + b => b = u + 1
row = col - n + b => b = u + n - i
n皇后问题图示理解

算法实现

#include <iostream>

using namespace std;

const int N = 20;
int n;                                  // 棋盘的排列总数
char g[N][N];                           // 存储棋盘信息,·为无,Q为queen
bool col[N], dg[N * 2], udg[N * 2];     // col[N] 这一列是否有queen
                                        // dg[N]  对角线上有无queen
                                        // udg[N] 反对角线上有无queen

void dfs(int u) {
    /*
      注意这里的答案格式控制,我错了两边
      第一次错是因为没仔细审题,棋盘每格子之间不用空格
      第二次错是因为每个答案之间有回车进行分隔
    */
    if (u == n) {
        for (int i = 0; i < n; i ++) 
            cout << g[i] << endl;
        cout << endl;
        return ;
    }
    /*
    row = u
    col = i
    dg = u + i
    udg = u - i + n
    对角线和反对角线的理解有两种:(见图解)
        1. 好理解一点的就是越往右下,i和u都增大
                            越往左下,i减小,u增大,+n是为了防止下标出现负数
        2. 另一种理解方式是通过直角坐标系的截距进行理解:
            row = -col + b => b = u + 1
            row = col - n + b => b = u + n - i
    */
    for (int i = 0; i < n; i ++) {                          // 竖列进行遍历
        if (!col[i] && !dg[u + i] && !udg[u - i + n]) {
            g[u][i] = 'Q';
            col[i] = dg[u + i] = udg[u - i + n] = true;
            dfs(u + 1);                                     // 每递归一层就是一横排,递归到u == n 为止
            col[i] = dg[u + i] = udg[u - i + n] = false;    
            g[u][i] = '.';
        }
    }

}

int main() {
    cin >> n;
    for (int i = 0; i < n; i ++) 
        for (int j = 0; j < n; j ++) 
            g[i][j] = '.';
    
    dfs(0);

    return 0;
}

总结

  注意答案格式控制,我错了两遍
  第一次错是因为没仔细审题,棋盘每格子之间不用空格
  第二次错是因为每个答案之间有回车进行分隔
N皇后问题——通俗易懂地讲解(C++) 注:参考程序猿小灰,hackbuteer1 八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上 (斜率为1),问有多少种摆法。高斯认为有76种方案。 让我们来举个栗子,下图的绿色格子是一个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些... 阅读详情

相关推荐

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

题目 N皇后回溯法求解空间 目的要求 目的: 1.用学到的书本知识解决实际问题的能力; 2.锻炼实际工作所需要的动手能力; 3.加强对数据结构和算法的应用; 4.锻炼自己以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用; 5.通过课程设计的实践,我们可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练; 6.通过课程设计提高编写...

qq_38409944的博客 7810

N皇后问题的两个最高效的算法

N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。 一、求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中...

编程资料大全 3999

算法分析之N皇后问题

因为这学期的算法分析课快要完了,也差不多进入复习阶段了,所以在这就把学习到的一些比较经典的算法拿出来晒晒,可能不是最好的,但怎么说也是为解决问题提供了一个思路。关于算法,有很多类型的问题,我在这里就拣一个复习一个了,呵呵。     今天要写的算法是源于八皇后问题,但在这里为了说明普遍性,直接介绍N皇后问题,与八皇后问题思路一样。这是ACM中一道典型的回溯题,当然其它方法也能对其求解,但毫无疑问回溯

nicolas_huan的博客 7611

n皇后问题(回溯法)

目录 1.问题描述 2.问题分析 3.完整源码 1.问题描述 八皇后问题是十九世纪著名的数学家高斯于1850年提出的。问题是:在8×8的棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。可以把八皇后问题扩展到n皇后问题,即在n×n的棋盘上摆放n个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上。 2.问题分析 确定问题状态:问题的状态即棋盘的布局状态 构造状态空间树:状态空间树的根为空棋盘,每个布局的下一步可能布局是该布局结点的子结..

qq_55168827的博客 5万+

遗传算法求解n皇后问题

我们进行这样的思考,假设有一个长颈鹿的种群,但是这群长颈鹿的脖子不算很长只能吃到底层的树叶,渐渐的,底层的树叶越来越少,这群短脖子的长颈鹿生存压力愈发增大。在长颈鹿种群繁衍的过程中,某些后代长颈鹿发生变异出现了长脖子的性状,它们可以吃到更丰裕的上层树叶,这样能吃到上层树叶的长颈鹿生存压力小,只能吃到下层树叶的长颈鹿生存压力大,随着时间的推移,短脖子的长颈鹿越来越少,长脖子的长颈鹿数量变得更多。所以,长脖子基因慢慢在种群中占据更大比例,这一过程就是自然选择。

weixin_54143563的博客 1299

回溯算法求解N皇后问题

1、回溯算法 (1)定义 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。 (2)基本思想 从一条路往前走,能进则进,不能进则退回来,换一条路再试。在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根节点出发深度探索解空间树。 (3)步...

cc098818的博客 777

【算法-回溯法】N皇后问题

回溯法 N皇后问题

@point 1万+

n皇后问题的c语言回溯算法实现

关于n皇后问题的c语言回溯算法实现,在代码块里有很详细的解释,这里不再进行赘述。但是代码中的uppertri[]数组和lowtri[]数组需要进行一下简单的解释: 这里假设n是4 图(1):表格中的值是每个皇后的行减去列得到的:raw-col 图(2):表格中的值是每个皇后的行加上列得到的:raw+col 分别有6种可能的值,为了方便处理,把每个图中的值都设定为从0到6, 那么只需要再对图(1)进...

qq_44980889的博客 1281

【经典算法】N皇后问题

经典N皇后问题的算法。做一道经典题目,来一场思维旅行。

ai15013602354的博客 1万+

【N皇后问题】递归+回溯算法求解N皇后问题

同一行上面,只能存在一个皇后。同一列上面,只能存在一个皇后。同一斜线上面,只能存在一个皇后。满足上面三个规则的一个放置方法,我们把他叫做N皇后的一个解,常见的N皇后问题有:四皇后、八皇后。对于四皇后问题,可以有下面两种摆放方法:在这里为了程序方便,我们规定:将整个棋盘看作是一个【nxn】的二维矩阵,其中矩阵中每一个单元格位置存放的元素,如果是【.】点号,则表示当前位置没有放置皇后;如果是【Q】符号,则表示当前位置放置了一个皇后。下面具体介绍一下,如何通过程序求解N皇后的问题。

✅ Java 开发工程师 1259

Bioinformatics2021 | FraGAT+:基于分子原始片段的多尺度图注意力机制的分子性质预测模型

Bioinformatics2021 | FraGAT:基于分子原始片段的多尺度图注意力机制的分子性质预测模型

justBeHerHero 2001

三种算法求解经典N皇后问题

三种算法求解经典N皇后问题,回溯法、递归(java实现)和位运算

qq_43166758的博客 9504

逆向分析踩坑记:当Frida在x86模拟器上‘看不见’ARM的so文件时,我们该如何手动定位与验证?

本文探讨了在x86模拟器上使用Frida进行逆向分析时,无法检测到ARM架构so文件的解决方案。通过分析内存映射、Frida的视觉盲区及手动定位技术,提供了兼容层、混合调试和原生ARM环境三种实用方案,帮助逆向工程师突破工具限制,实现精准定位与验证。

weixin_27697385的博客 222

回溯算法——n皇后问题

盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上,问有多少种摆法。我们可以思考,回溯算法,用最直白的话解释就是,当前这路不通,怎么办,回去,到上一个位置换个方向;,在一个集合中递归找子集,集合的大小就可以理解为需要递归的层;,不然就在函数体中出不来,会出错。、对于这三个规则,所以我们的核心层就应该,有两个判断(),就需要回溯到上一行皇后,更改上一行皇后的列。),就需要回溯到上一行皇后,更改上一行皇后的列。,那就结束呗,无路可走还继续呆着干嘛,哈哈哈哈;

桑稚远方的博客 3994

OpenCV中SGBM中BT代价计算

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_27606639的博客 5978

微信支付V2,jsapi支付拉起收银台报错:调用支付JSAPI缺少参数:total_fee

拉起收银台报错

m0_54355172的博客 3873

LasVegas算法 n皇后问题

/* * Abstract: * EX7. 写一LasVegas算法求n皇后问题,求n=12~20时,最优的StepVegas的值。 * * Author : Ace.Ma * Date : 2012/9/18 * Version: 0.1 */ #include #include #include #include #include #

艾斯 4016

S32K344 Flash Driver实战:手把手教你实现任意字节写入与扇区解锁(含C40_Ip避坑指南)

本文深入解析S32K344微控制器的Flash驱动开发,重点解决C40_Ip驱动库的8字节对齐限制和扇区保护锁问题。通过实战案例和代码示例,详细介绍了如何实现任意字节写入、扇区解锁及性能优化策略,为Bootloader和OTA升级等应用提供可靠解决方案。

weixin_33713707的博客 432

使用回溯算法求解N皇后问题

文章目录N皇后问题描述回溯算法简介回溯算法对问题的要求回溯算法的思想回溯算法的模板使用回溯算法求解N皇后问题 N皇后问题描述 在一个N * N的国际象棋棋盘上需要放置N个皇后,放置时要保证这些皇后不能攻击彼此,也就是要保证在同一行、同一列、同一斜线上都只有一个皇后。该问题要求求出所有满足要求的放置方案。 回溯算法简介 回溯算法对问题的要求 当一个问题满足: 多步:需要多步来完成 多选:每一步有...

folkboat的博客 1517

新手必看:CiscoPacket Tracer从零搭建局域网(含ARP协议详解)

本文为网络新手提供了一份使用Cisco Packet Tracer从零搭建局域网的详细指南。通过构建基础网络拓扑、配置IP地址,并深入剖析ARP协议的工作原理,帮助读者理解IP地址与MAC地址的映射关系,掌握局域网通信的核心机制。

weixin_29275257的博客 205

5、高级综合技术:从调度到优化的全面解析

本文深入解析了高级综合技术,涵盖从控制/数据流图构建、调度算法、分配绑定策略到编译器优化的全流程。通过案例分析和对比,探讨了不同优化策略对性能和资源利用的影响,并总结了关键要点及未来发展趋势,为高效利用FPGA实现数字设计提供了全面指导。

night的博客 119

算法课程设计 N皇后问题

一 题目 n皇后问题的解决与算法优化 二 目的要求 利用学到的算法设计知识,通过布置具有一定难度的设计题目,帮助学生对所学算法知识进行巩固及系统运用,并进一步提高独立的问题分析和算法设计的能力。 设计要求:按算法设计要求完成各阶段文档: 课程设计概述 2.问题分析 3.采用的算法模型或算法策略 4.算法设计 5.算法分析 6.编码实现 7.测试用例设计 8.测试与运行记录...

为梦奔跑的博客 5156

HDMI接口及其在编程中的应用

在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文将介绍HDMI接口的基本原理以及如何在编程中使用HDMI接口。在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文介绍了HDMI接口的基本原理,并提供了使用Python编程语言和相关库实现HDMI接口应用的示例代码。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。

CodeByte的博客 803

算法 回溯 【详解N皇后问题】

一、问题介绍

Kukeoo的博客 2287

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

遗传算法实现n皇后问题

内容: 用遗传算法求解n皇后问题。n*n的棋盘上摆放n个皇后,两个皇后如果在同一直线或者同一对角线就会互相攻击。 找一种摆法,使得任意两个皇后之间都不会互相攻击。 问题描述: 遗传算法举例:8皇后问题 个体:长为8的序列,每一列的值代表对 应列的皇后所在的行。 下图状态:83742516 适应度函数= 28-互相攻击的皇后对 的数目 (不互相攻击的皇后对的数目) 好的状态对应较大的适应度函数值 (min = 0, max = 8 × 7/2 = 28。 注意事项: 种群大小(每代的个体数量)设置:

ym18861512953的博客 3601

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: “No primary or single unique constructor found for interface javax.servlet.http.HttpSession”Bug修复
下一篇: 【算法】C++常用STL与STL中常用方法总结
妄想的男孩
博客等级 码龄5年 730粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值