DFS算法经典题目: Leetcode 51.N皇后

server/2024/10/21 4:22:05/

DFS算法经典题目: Leetcode 51.N皇后

题目详情如下

image-20241018100407537.png

这道题如果使用暴力解法的话,需要对N个皇后放在每个地方都进行枚举并判断是否可行,时间复杂度非常之高,肯定是过不了的,所以需要使用其他解法。

根据题目可以知道每两个皇后之间的位置关系不能是在同一条直线或同一条斜线上。所以,每个皇后只能位于不同行不同列。每一行有且只有一个皇后,每一列有且只有一个皇后,且任何两个皇后不能位于一条斜线上,所以想到了DFS算法解决,主要思路即是回溯。

具体做法是:使用一个数组记录每行放置的皇后的下标,一次在每一行放置一个皇后,每次放置的新皇后不能与前N行放置的皇后在同一条直线或斜线上,并更新此次放置皇后的下标。当N个皇后都放置完毕,这个即是一个解,再将这数组转换为棋盘状态返回。

由于每个皇后必须位于不同行不同列,所以第一个皇后有N种选择可以放置,第二个皇后便是少一种选择,以此类推,最后的时间复杂度是O(N!)

代码思路

为了判断一个位置所在的直线或斜线上是否有其他皇后,使用三个hash set记录列以及两个方向的斜线是否有其他皇后。

列的话使用下标即可表示。

而斜线的话,从左上到右下的斜线,每个位置满足行下标与列下表之差相等,例如(0,0)与(1,1)在一条线上;

从右上到左下的斜线,每个位置满足行下标与列下表之和相等,例如(0,1)与(1,0)在一条线上。

所以在判断时,对于每个位置判断是否在三个集合中,如果都不在,则当前位置可放置。

上代码:

class Solution {
public:vector<vector<string>> solveNQueens(int n) {auto solutions = vector<vector<string>>();auto queens = vector<int>(n, -1);auto columns = unordered_set<int>();auto diagonals1 = unordered_set<int>();auto diagonals2 = unordered_set<int>();DFS(solutions, queens, n, 0, columns, diagonals1, diagonals2);return solutions;}void DFS(vector<vector<string>> &solutions, vector<int> &queens, int n, int row, unordered_set<int> &columns, unordered_set<int> &diagonals1, unordered_set<int> &diagonals2) {if (row == n) {vector<string> board = generateBoard(queens, n);solutions.push_back(board);} else {for (int i = 0; i < n; i++) {if (columns.find(i) != columns.end()) {continue;}int diagonal1 = row - i;if (diagonals1.find(diagonal1) != diagonals1.end()) {continue;}int diagonal2 = row + i;if (diagonals2.find(diagonal2) != diagonals2.end()) {continue;}queens[row] = i;columns.insert(i);diagonals1.insert(diagonal1);diagonals2.insert(diagonal2);DFS(solutions, queens, n, row + 1, columns, diagonals1, diagonals2);queens[row] = -1;columns.erase(i);diagonals1.erase(diagonal1);diagonals2.erase(diagonal2);}}}vector<string> generateBoard(vector<int> &queens, int n) {auto board = vector<string>();for (int i = 0; i < n; i++) {string row = string(n, '.');row[queens[i]] = 'Q';board.push_back(row);}return board;}
};

复杂度分析

时间复杂度:O(N!)

空间复杂度:O(N),其中 N 是皇后数量。空间复杂度主要取决于递归调用层数、记录每行放置的皇后的列下标的数组以及三个集合,递归调用层数不会超过 N,数组的长度为 N,每个集合的元素个数都不会超过 N。

image-20241018102256149.png


http://www.ppmy.cn/server/133532.html

相关文章

text2sql: multi-agent实现思路MAC-SQL

MAC-SQL出自2023年12月的论文《MAC-SQL: A Multi-Agent Collaborative Framework for Text-to-SQL》(github)&#xff0c;它是用基于LLM的multi-agent来实现text2sql。 MAC-SQL的整体思路如论文图2所示&#xff0c;由Decomposer、Selector、Refiner三个agent组成&#xff0c;个…

目标检测系统中需要【重新训练模型】说明

上百种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09;-CSDN博客 目标检测系统操作说明【用户使用指南】&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09;-CSDN…

算法专题七: 分治归并

目录 1. 排序数组2. 交易逆序对的总数3. 计算右侧小于当前元素的个数4. 翻转对 1. 排序数组 算法思路: 本道题使用归并的思路进行排序, 先讲数组分为左右两个区间, 然后合并两个有序数组. class Solution {vector<int> tmp; public:vector<int> sortArray(vector&…

wifi、热点密码破解 - python

乐子脚本&#xff0c;有点小慢&#xff0c;试过多线程&#xff0c;系统 wifi 连接太慢了&#xff0c;需要时间确认&#xff0c;多线程的话系统根本反应不过来。 也就可以试试破解别人的热点&#xff0c;一般都是 123456 这样的傻鸟口令 # coding:utf-8 import pywifi from pyw…

python 打包为动态链接库(.so文件)

参考资料&#xff1a;https://medium.com/yeap0022/linux-compress-python-packages-into-shared-library-so-8342bffab001 注意事项&#xff1a;.py, .c后缀文件都可以删掉&#xff0c;cache也可以删掉&#xff0c;但是__init__.py文件不能删&#xff0c;建立的子文件夹也不能…

JavaWeb环境下Spring Boot在线考试系统的优化策略

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不足&#xff0c;创建了一个计算机管理基于Ja…

Android——通过MediaStore查询图片

查询图片&#xff1a; private void loadImageList() {String[] columns new String[]{MediaStore.Images.Media._ID, // 编号MediaStore.Images.Media.TITLE, // 标题MediaStore.Images.Media.SIZE, // 文件大小MediaStore.Images.Media.DATA, // 文件路径};Cursor cursor g…

基于FPGA的以太网设计(四)

1.ARP协议简介 ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;即地址解析协议&#xff0c;是根据IP地址&#xff08;逻辑地址&#xff09;获取MAC地址的一种TCP/IP协议。在以太网通信中&#xff0c;数据是以“帧”的格式进行传输的&#xff0c;帧格式里…