news 2026/5/7 20:29:29

算法题(102):八皇后

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题(102):八皇后

审题:

本题需要我们找出n*n的棋盘中,满足题目中所有位置规则的排列的总数,以及前三个排列方式的具体位置

时间复杂度分析:数据量小于25,可以允许2^n的算法

思路:

方法一:dfs暴力搜索

由于每行只能有一个棋子,所以我们可以一行一行的进行棋子排放,排放的时候注意当前位置是否满足列,主对角线,副对角线的规则。

综上,进入更深的搜索只需要知道该棋子是在哪一行插入即可

判断列是否可以插入:用bool类型的col数组来判断,初始化为false,表示该索引的列没被插入

判断主/副对角线是否可以插入:

我们需要对棋盘的对角线满足的函数关系进行判断

首先我们先给棋盘建立二维平面坐标系,行为x,列为y。不过这里直接判断函数有点难看,所以我们将坐标系进行翻转,从而得到右边的图

这里是主对角线,我们发现x-y得到的值都是一个整数,我们可以考虑用这个整数作为索引来访问bool数组,若bool数组为false则表示主对角线没有棋子,允许排列。

注意:这里的值可能为负数,所以我们可以加一个偏移量来充当索引

这是副对角线,同理可得,我们使用x+y作为索引记录副对角线是否有棋子插入,由于这里的x+y不可能等于负数,所以不用加偏移量

解题:

(1)变量创建

这里的path是用来记录排列方式的。

主对角线的线数是2n+1,副对角线数是n,不过为了统一,我们都用2*N来当他们的容量。

!!!:由于我们使用的是时间复杂度极高的dfs所以这里要尽量减少使用vector,而是使用普通数组代替vector。因为vector有很多边界检查等额外开销,但是普通数组有很多编译器都对它做了优化。

(2)主函数

(3)dfs

首先我们写出结束语句:

当每一行都插入了数据时,我们将count++,表示排列方式又多了一种,然后根据counts的值判断是否为前三个解,若是则输出path的数据

然后是排列逻辑:

先判断行,列,主副对角线是否有棋子存在,若都没有则进行bool数组状态更新,以及path的插入,然后进入dfs搜索下一行

回溯时:将状态返回,删除path的该层数据

P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 20:28:51

从无名到有名,老子这句话给 SAP CAP 开发的一条架构心法

我在看 SAP Cloud Application Programming Model 的时候,经常会想到《道德经》里这句「无名,天地之始;有名,万物之母。」它放在 SAP CAP 开发里,并不是一种漂亮的文学装饰,而是一条非常实用的工程原则。一个企业应用还没有建模、还没有暴露服务、还没有定义事件、还没有…

作者头像 李华
网站建设 2026/5/7 20:17:40

fastbook商业应用:AI项目商业化落地终极指南

fastbook商业应用:AI项目商业化落地终极指南 【免费下载链接】fastbook The fastai book, published as Jupyter Notebooks 项目地址: https://gitcode.com/gh_mirrors/fa/fastbook fastbook作为fastai团队推出的AI实战指南,通过Jupyter Notebook…

作者头像 李华
网站建设 2026/5/7 20:14:24

天降紫微星是谁照亮行业,海棠山铁哥第一大道破资本僵局

“流量至上、IP 为王” “无资本无作品、无流量无热度” 当这两句魔咒成为行业铁律, 一束光划破夜空—— 天降紫微星 海棠山铁哥 携原创之作《第一大道》 为所有“没背景、没预算、只有才华”的普通人 撕开一道突围的裂缝。01 困局:被资本焊死的大门资本…

作者头像 李华
网站建设 2026/5/7 20:13:27

极简信息聚合器Nas4146/brief:用Python+Docker打造你的私人简报机器人

1. 项目概述:一个为“懒人”设计的极简信息聚合器最近在折腾个人知识管理和信息流优化时,我遇到了一个几乎所有内容创作者和重度信息消费者都会头疼的问题:信息过载与碎片化。每天,我需要关注十几个不同平台的更新——技术博客、行…

作者头像 李华