AcWing 843:n-皇后问题 ← dfs

article/2025/6/7 12:05:27

【题目来源】
https://www.acwing.com/problem/content/845/

https://www.lanqiao.cn/problems/1508/learning/
https://www.luogu.com.cn/problem/P1219

【题目描述】
n 皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

【输入格式】
共一行,包含整数 n。

【输出格式】
每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。
其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。
每个方案输出完成后,输出一个空行。
注意:行末不能有多余空格。
输出方案的顺序任意,只要不重复且没有遗漏即可。

【数据范围】
1≤n≤9

【输入样例】
4

【输出样例】
.Q..
...Q
Q...
..Q.

..Q.
Q...
...Q
.Q..

【算法分析】
● 请注意,n 维方阵中 row-col 的范围是 [-n+1,n-1],row+col 的范围是 [0,2n-2],所以主对角线和次对角线的数量都为 2n-1,即存储主对角线及次对角线数量的数组长度都为 2n-1。

​​​​​​​主对角线是棋盘中从左上到右下的斜线,主斜线 zxx[] 是棋盘中与主对角线平行的斜线。
观察易知,同一主斜线上各棋格的横坐标 x 减去纵坐标 y 的差相等。即说明同一主斜线上多个棋格可通过减法映射到数组中的同一位置。此时,若判断某条主斜线上是否出现过一次皇后,即查看 zxx[x - y] 是否为空即可。但这样做减法时可能会得到一个负数,是没法直接映射到数组中的,因此在主斜线上做判断时统一加上一个常量保证非负,即 zxx[x - y + n]。

● 
副对角线是棋盘中从左下到右上的斜线,副斜线 fxx[] 是棋盘中与副对角线平行的斜线。
观察易知,同一副斜线上各棋格的横坐标 x 加上纵坐标 y 的和相等。即说明同一副斜线上多个棋格可通过加法映射到数组中的同一位置。此时,若判断某条副斜线上是否出现过一次皇后,即查看 fxx[x + y] 是否为空即可。

● 如下代码是 N 皇后问题回溯算法的核心部分。

for(int i=0; i<n; i++) {if(!col[i] && !fxx[i+k] && !zxx[n-i+k]) {a[k][i]='Q';col[i]=fxx[i+k]=zxx[n-i+k]=1;dfs(k+1);col[i]=fxx[i+k]=zxx[n-i+k]=0;a[k][i]='.';}
}

逐行解释如下:
(1)for(int i=0; i<n; i++):尝试在当前行 k 的每一列 i 放置皇后
(2)if(!col[i] && !fxx[i+k] && !zxx[n-i+k]):检查三个条件
!col[i] 表示第 i 列没有皇后
!fxx[i+k] 表示
副斜线(左下到右上)没有皇后
!zxx[n-i+k] 表示
主斜线(左上到右下)没有皇后
(3)如果条件满足:
a[k][i]='Q':在棋盘 k 行 i 列放置皇后
col[i]=fxx[i+k]=zxx[n-i+k]=1:标记列和两个对角线已被占用
dfs(k+1):递归处理下一行
(4)回溯部分:
col[i]=fxx[i+k]=zxx[n-i+k]=0:撤销标记
a[k][i]='.':移除皇后

如上核心代码实现了
通过三个一维数组 (col,zxx,fxx) 替代二维数组检查,将空间复杂度从 O(N²) 降到O(N),是 N 皇后问题的优化解法

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int N=10;
char a[N][N];
bool zxx[N<<1],fxx[N<<1],col[N];
int n;void dfs(int k) { //k:rowif(k==n) {for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {cout<<a[i][j];}cout<<endl;}cout<<endl;return;}for(int i=0; i<n; i++) { //i:columnif(!col[i] && !fxx[i+k] && !zxx[n-i+k]) {a[k][i]='Q';col[i]=fxx[i+k]=zxx[n-i+k]=1;dfs(k+1);col[i]=fxx[i+k]=zxx[n-i+k]=0;a[k][i]='.';}}
}int main() {cin>>n;for(int i=0; i<n; i++)for(int j=0; j<n; j++)a[i][j]='.';dfs(0);return 0;
}/*
in:
4out:
.Q..
...Q
Q...
..Q...Q.
Q...
...Q
.Q..
*/




【参考文献】
https://m.w3cschool.cn/hellocpp/hellocpp-vq793tl7.html
https://www.acwing.com/solution/content/30231/
https://www.lanqiao.cn/problems/1508/learning/
https://www.luogu.com.cn/problem/P1219
https://www.acwing.com/solution/content/179688/





 


http://www.hkcw.cn/article/VebUvDbUWr.shtml

相关文章

风机巡检方案艰难之路

2025年是“双碳”目标提出后首个五年计划收关节点&#xff0c;政策端通过强化大基地建设与海风开发确保既定风电目标落地。根据《2025年能源工作指导意见》&#xff0c;2025年将通过加速第二批/第三批大基地及海上风电建设保障目标兑现。据联储证券预计&#xff0c;2025年全年陆…

Java-redis实现限时在线秒杀功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql数据库表设…

龙虎榜——20250603

上证指数放量收阳线&#xff0c;阳包阴&#xff0c;量能超过5天均量&#xff0c;个股涨多跌少&#xff0c;行情有所回暖。 深证指数缩量收阳线&#xff0c;再次回打支撑位。 2025年6月3日龙虎榜行业方向分析 1. 医药&#xff08;创新药原料药出口&#xff09; 代表标的&…

永磁同步电机无速度算法--互补滑模观测器

一、原理介绍 采用了互补滑模变结构观测器&#xff0c;滑模面选择了广义滑模面和互补滑模面相结合的设计&#xff0c;这样可以有效地降低系统的跟踪误差&#xff0c;提高系统的跟踪性能&#xff0c;切换控制率选择饱和函数&#xff0c;抑制了传统SMC 的抖振现象。 二、仿真模型…

2025年AIR SCI1区TOP,多策略增强蜣螂算法MDBO+实际工程问题,深度解析+性能实测

目录 1.摘要2.蜣螂优化算法DBO原理3.改进策略4.结果展示5.参考文献6.代码获取7..算法辅导应用定制读者交流 1.摘要 蜣螂优化算法&#xff08;DBO&#xff09;作为一种创新元启发式算法&#xff0c;虽具备良好的数值优化能力&#xff0c;但存在收敛速度慢且易陷入局部最优的问题…

【notepad++】如何设置notepad++背景颜色?

如何设置notepad背景颜色&#xff1f; 设置--语言格式设置 勾选使用全局背景色 例如选择护眼色---80&#xff0c;97&#xff0c;205&#xff1b;

Gitee Wiki:重塑关键领域软件研发的知识管理范式

在数字化转型浪潮席卷全球的当下&#xff0c;关键领域软件研发正面临前所未有的知识管理挑战。传统文档管理模式的局限性日益凸显&#xff0c;知识传承的断层问题愈发严重&#xff0c;团队协作效率的瓶颈亟待突破。Gitee Wiki作为新一代知识管理平台&#xff0c;正在通过技术创…

电源防反接保护电路分析

电路&#xff1a; 这是一个电源输入防反接的电路&#xff0c;通过NMOS来实现。 1、正常接入电源。 正常接入电源的时候&#xff0c;VCC12V&#xff0c;这时候&#xff0c;电流通过R1、R2和NMOS的体二极管D形成一个回路&#xff0c;此时NMOS还未导通。 通过计算可以得到Vs0.7V&a…

焊缝缺陷焊接缺陷识别分割数据集labelme格式5543张4类别

数据集中有超过一半为增强图片&#xff0c;请认真观察图片预览 数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;5543 标注数量(json文件个数)&#xff1a;5543 标注类别数&#xff1a;4…

腾讯云国际版和国内版账户通用吗?一样吗?为什么?

在当今全球化的数字化时代&#xff0c;云计算服务成为众多企业和个人拓展业务、存储数据的重要选择。腾讯云作为国内领先的云服务提供商&#xff0c;其国际版和国内版备受关注。那么&#xff0c;腾讯云国际版和国内版账户是否通用&#xff1f;它们究竟一样吗&#xff1f;背后又…

C++初赛的三讲

C++初赛的三讲 C++初赛第一/二讲链接:CSP-J算法串讲完善程序解题思路1.查找算法顺序查找二分查找二分查找的步骤二分查找法的代码2.排序算法冒泡排序冒泡排序的代码插入排序插入排序的代码选择排序选择排序的代码计数排序C++初赛第一/二讲链接: 1.链接: C++初赛第一讲1.0 2.…

pikachu靶场通关笔记12 XSS关卡08-XSS之htmlspecialchars(四种方法渗透)

目录 一、htmlspecialchars 二、源码分析 1、进入靶场 2、代码审计 3、渗透思路 &#xff08;1&#xff09;利用单引号绕过 &#xff08;2&#xff09;利用协议绕过 三、渗透实战 1、探测是否有过滤 2、注入payload1 3、注入payload2 4、注入payload3 5、注入payl…

Github 2025-06-03Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2025-06-03统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10Rust项目1HTML项目1C项目1 系统设计指南 创建周期&#xff1a;2507 天开发语言&#xff1a;Pyt…

多线程环境中,如果多个线程同时尝试向同一个TCP客户端发送数据,添加同步机制

原代码 public async Task SendToClientAsync(TcpClient targetClient, byte[] data, int offset, int length) {try{// 1. 检查客户端是否有效if (targetClient null || !targetClient.Connected){Console.WriteLine("Cannot send: client is not connected");ret…

java后端生成心电图-jfreechart

用jfreechart生成心电图 先上成功的图片 上代码 1.导入包 implementation org.jfree:jfreechart:1.5.4implementation org.jfree:jcommon:1.0.242.实现代码 对数据进行滤波 转换单位 package com.shinrun.infrastructure.util;import java.util.ArrayList; import java.ut…

项目前置知识——不定参以及设计模式

1.C语言不定参宏函数 c语言中&#xff0c;printf就是一个不定参函数&#xff0c;在使用不定参宏函数时&#xff0c;我们使用__VA_ARGS__来解析不定参&#xff1a; #include <iostream> #include <cstdarg>#define LOG(fmt/*格式*/, .../*用...表示不定参*/) prin…

redis哨兵与集群部署

目录 一.哨兵模式部署 1.设置Redis哨兵模式配置文件的属组以及属主&#xff08;所有节点操作&#xff09; 2.修改Redis哨兵模式的配置文件&#xff08;所有节点操作&#xff09; 3.准备server文件启动&#xff0c;先启主再启从&#xff08;所有节点操作&#xff09; 4.验证…

飞腾D2000,麒麟系统V10,docker,ubuntu1804,小白入门喂饭级教程

#下载docker Index of linux/static/stable/ 根据电脑的CPU类型选择&#xff1a; Intel和AMD选x86_64飞腾D2000选aarch64 #选择较新的版本 #在包含下载的docker-XX.X.X.tgz的文件夹中右键->打开终端 # 解压安装包&#xff08;根据实际下载的文件&#xff09; tar -zxvf …

torch.nn中的各种组件

Content 线性层 (Linear Layers)**核心原理&#xff1a;线性变换****关键组件****示例代码****示例1&#xff1a;基础线性层 (nn.Linear)****示例2&#xff1a;双线性层 (nn.Bilinear)** **应用场景** 非线性激活函数 (Non-linear Activations)**常用非线性激活函数****1. ReLU…

高性能分布式消息队列系统(二)

上一篇博客将C进行实现消息队列的用到的核心技术以及环境配置进行了详细的说明&#xff0c;这一篇博客进行记录消息队列进行实现的核心模块的设计 五、项目的需求分析 5.1、项目框架的概念性理解 5.1.1、消息队列的设计和生产消费者模型的关系 在现代系统架构中&#xff0c;…