深度优先搜索(DFS)——八皇后问题与全排列问题

news/2025/2/11 9:40:46/

在这里插入图片描述
( ^ _ ^ )
数据结构好难哇(哭

1.BFS和DFS

数据结构空间性质
DFSstackO(h)不具有最短性质
BFSqueueO(2^h)具有最短路性质

空间上DFS占优势,但是BFS具有最短性
(若所有权重都是1,则BFS一定最短)(应用:最短距离,最少步数)

2.DFS

深度优先搜索(Depth-First Search, DFS)是算法领域的核心思想之一,它像探险家一样执着地向深处探索,直到触底再回溯寻找新路径。本文将通过八皇后问题全排列问题两个经典案例,揭开DFS与回溯算法的神秘面纱。


从搜索树的角度来考虑

从两个经典的例子来入手

全排列问题

(P1706 全排列问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))


#include <iostream>
using namespace std;const int N = 10;int n;
int path[N];
bool st[N];void dfs(int u) {if (u == n) {for (int i = 0; i < n; i++) {printf("%5d", path[i]);//每个数字5个场宽可以用%5d来实现}puts("");return;}for (int i = 1; i <= n; i++) {if (!st[i]) {path[u] = i;st[i] = true;dfs(u + 1);st[i] = false;}}
}int main() {cin >> n;dfs(0);return 0;
}

八皇后问题

(P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

冷知识:皇后是米字攻击(不会就我不知道吧orzorz

每一行只会有一个皇后

左下到右上的斜线,同一条上,横纵坐标之和不变,即dg数组的同一格;左上到右下斜线同理,udg数组。

核心逻辑:

*列冲突检测:col not in queens

*主对角线检测:row-col唯一

*副对角线检测:row+col唯一

*递归层级:每层对应一行皇后位置选择

*复杂度分析:时间复杂度O(N!),空间复杂度O(N)

#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)#include <iostream>
using namespace std;const int N = 20;int n;
int path[N];
bool col[N], dg[N * 2], udg[N * 2];  // 对角线数组大小调整为 2*N
int cnt = 0;  // 记录解的总数// 深度优先搜索函数
void dfs(int u) {if (u == n) {cnt++;if (cnt <= 3) {for (int i = 0; i < n; i++) {if (i > 0) cout << " ";cout << path[i] + 1;  // 输出列号,从 1 开始}cout << endl;}return;}for (int i = 0; i < n; i++) {if (!col[i] && !dg[u + i] && !udg[n - u + i]) {path[u] = i;col[i] = dg[u + i] = udg[n - u + i] = true;dfs(u + 1);col[i] = dg[u + i] = udg[n - u + i] = false;  // 回溯}}
}int main() {cin >> n;dfs(0);cout << cnt << endl;  // 输出解的总数return 0;
}

问题对比与本质解析

特性八皇后问题全排列问题
搜索空间树状结构(每层选择列位置)排列树(元素选择组合)
约束条件三维冲突检测(行、列、对角线)一维约束(元素不可重复使用)
剪枝策略提前终止非法路径通过标记数组避免重复选择
解的特征二维空间布局一维元素序列
时间复杂度O(n!)O(n×n!)

共同本质:通过递归构建决策树,利用回溯遍历所有可能解,使用剪枝策略提高效率。


DFS的哲学启示(大雾

  1. 深度优先:专注当下选择,极致深入后再考虑其他可能
  2. 适时回头:发现错误及时回溯,避免在错误路径上浪费资源
  3. 系统记录:通过状态标记避免重复探索
  4. 接受不完美:允许试错是找到最优解的必要代价

这两个经典问题展示了DFS在解决组合优化问题时的强大能力。当我们面对复杂问题时,不妨像DFS一样:选定方向勇敢深入,发现此路不通时优雅回溯,终将找到属于自己的完美解。


http://www.ppmy.cn/news/1571124.html

相关文章

科技资讯杂志科技资讯杂志社科技资讯编辑部2024年第24期目录

学思践悟二十大 “枫桥经验”的思想政治教育内涵及启示——践行党的二十大精神 洪希彦; 1-330 构建符合党的二十大精神的高职院校劳动教育课程体系研究 李曼; 4-7 党的二十大精神引领下“隧道施工”课程思政探究 张志明;陈国辉; 8-10 新质生产力 新质生产力视域…

Pdf手册阅读(1)--数字签名篇

原文阅读摘要 PDF支持的数字签名&#xff0c; 不仅仅是公私钥签名&#xff0c;还可以是指纹、手写、虹膜等生物识别签名。PDF签名的计算方式&#xff0c;可以基于字节范围进行计算&#xff0c;也可以基于Pdf 对象&#xff08;pdf object&#xff09;进行计算。 PDF文件可能包…

【详细版】DETR系列之Deformable DETR(2021 ICLR)

论文标题Deformable DETR: Deformable Transformers for End-to-End Object Detection论文作者Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai发表日期2021年03月01日GB引用> Xizhou Zhu, Weijie Su, Lewei Lu, et al. Deformable DETR: Deformable T…

elementplus 使用日期时间选择器,设置可选范围为前后大于2年且只能选择历史时间不能大于当前时间点

需求&#xff1a;时间选择器可选的时间范围进行限制&#xff0c;-2年<a<2年且a<new Date().getTime()核心&#xff1a;这里需要注意plus版没有picker-options换成disabled-date属性了&#xff0c;使用了visible-change和calendar-change属性逻辑&#xff1a;另设一个参…

保姆级教程Docker部署Zookeeper模式的Kafka镜像

目录 一、安装Docker及可视化工具 二、Docker部署Zookeeper 三、单节点部署 1、创建挂载目录 2、命令运行容器 3、Compose运行容器 4、查看运行状态 5、验证功能 四、部署可视化工具 1、创建挂载目录 2、Compose运行容器 3、查看运行状态 一、安装Docker及可视化工…

相机开启状态下拔出SD卡导致的数据丢失问题及恢复方法

在使用数码相机拍摄照片或视频时&#xff0c;我们偶尔会遇到急需查看已拍摄内容或者管理存储空间的情况。有时&#xff0c;在未关闭相机电源的情况下&#xff0c;用户可能会尝试直接拉出SD卡&#xff0c;这种操作极有可能导致数据丢失甚至损坏SD卡。本文将详细探讨这一现象&…

前端导出pdf,所见即所得

一、推荐方案&#xff1a;html2canvas jsPDF&#xff08;图片式PDF&#xff09; javascript import html2canvas from html2canvas; import jsPDF from jspdf;const exportPDF async (elementId, fileName) > {const element document.getElementById(elementId);// 1.…

DFS+回溯+剪枝(深度优先搜索)——搜索算法

DFS也就是深度优先搜索&#xff0c;比如二叉树的前&#xff0c;中&#xff0c;后序遍历都属于DFS。其本质是递归&#xff0c;要学好DFS首先需要掌握递归。接下来咱们就一起来学习DFS涉及的算法。 一、递归 1.什么是递归&#xff1f; 递归可以这样理解把它拆分出来&#xff0…