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

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

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.mzph.cn/web/69462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink 内存模型各部分大小计算公式

Flink 的运行平台 如果 Flink 是运行在 yarn 或者 standalone 模式的话&#xff0c;其实都是运行在 JVM 的基础上的&#xff0c;所以首先 Flink 组件运行所需要给 JVM 本身要耗费的内存大小。无论是 JobManager 或者 TaskManager &#xff0c;他们 JVM 内存的大小都是一样的&a…

Vue07

一、Vuex 概述 目标&#xff1a;明确Vuex是什么&#xff0c;应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以管理 Vue 通用的数据 (多组件共享的数据)。例如&#xff1a;购物车数…

Linux内核中的软中断与NAPI机制:高效处理网络数据包

在现代操作系统中,中断处理是系统性能的关键因素之一,尤其是在处理高负载的网络数据包时。Linux内核通过软中断(SoftIRQ)和NAPI(New API)机制,实现了高效的网络数据包处理。本文将深入探讨软中断和NAPI机制的原理、实现方式以及它们在处理网络数据包中的作用。 一、软中…

Linux 安装 Ollama

1、下载地址 Download Ollama on Linux 2、有网络直接执行 curl -fsSL https://ollama.com/install.sh | sh 命令 3、下载慢的解决方法 1、curl -fsSL https://ollama.com/install.sh -o ollama_install.sh 2、sed -i s|https://ollama.com/download/ollama-linux|https://…

Docker Desktop无法安装报错(求助记录中)

之前Docker Desktop无法使用&#xff0c;报了一个注册表的错误&#xff08;忘记截图&#xff09;我想着更新安装下应该就好了&#xff0c;结果Docker Desktop一直无法安装&#xff0c;花了几天都没解决。同时我的window11更新也出现下载错误 - 0x80040154异常,启动或关闭Window…

Docker入门(Windows)

视频链接&#xff1a;Docker | 狂神说 环境说明 Windows For Docker WSL2 概念 Docker是什么&#xff1f; 百度百科&#xff1a;百度百科 Docker 是一个开源的平台&#xff0c;它利用操作系统级虚拟化技术来打包和运行应用程序。通过使用容器化技术&#xff0c;Docker 提…

kafka生产者之发送模式与ACK

文章目录 Kafka的发送模式Kafka的ack机制发送模式与ack的关联重试次数总结 在Kafka中&#xff0c;发送模式与ack机制紧密相关&#xff0c;它们共同影响着消息发送的可靠性和性能。 Kafka的发送模式 发后即忘&#xff08;Fire and Forget&#xff09;&#xff1a;生产者发送消息…

STM32 RTC亚秒

rtc时钟功能实现&#xff1a;rtc模块在stm32内部&#xff0c;由电池或者主电源供电。如下图&#xff0c;需注意实现时仅需设置一次初始化。 1、stm32cubemx 代码生成界面设置&#xff0c;仅需开启时钟源和激活日历功能。 2、生成的代码,需要对时钟进行初始化&#xff0c;仅需…

kafka服务端之延时操作实现原理

文章目录 背景案例延时生产实现原理延时拉取实现原理 总结 背景 上篇我们说到了kafka时间轮是延时操作内部实现的重要数据结构&#xff0c;这篇我们来说下kafka内部的延时操作实现原理。这里我们以延时生产和延时拉取为例说明延时操作的实现原理。 案例 延时生产 我们知道如…

【算法】动态规划专题⑥ —— 完全背包问题 python

目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题&#xff0c;它与0-1背包问题相似&#xff0c;但有一个关键的区别&#xff1a;在完全背包问题中&#xff0c;每种物品都有无限的数量可用。…

第四十章:职场转折:突破困境,重新出发

从绍兴与岳父岳母温馨相聚归来后&#xff0c;小冷满心都是温暖与幸福&#xff0c;本以为生活与工作会继续平稳前行&#xff0c;然而&#xff0c;命运却悄然为他的职场之路埋下了转折的伏笔。 平静工作下的暗潮涌动 小冷所在的公司是一家专注于地图导航与位置服务的企业&#xf…

VSCode中出现“#include错误,请更新includePath“问题,解决方法

1、出现的问题 在编写C程序时&#xff0c;想引用头文件但是出现如下提示&#xff1a; &#xff08;1&#xff09;首先检查要引用的头文件是否存在&#xff0c;位于哪里。 &#xff08;2&#xff09;如果头文件存在&#xff0c;在编译时提醒VSCode终端中"#include错误&am…

ElementUI的常用组件及使用技巧

1. 引言 项目背景与目标 随着前端技术的快速发展,构建高效、美观的用户界面变得越来越重要。ElementUI作为一款基于Vue.js的组件库,提供了丰富的组件和工具,帮助开发者快速构建高质量的Web应用。本文旨在介绍ElementUI的常用组件及其使用技巧,帮助开发者更好地利用Elemen…

实验5 配置OSPFv2验证

实验5 配置OSPFv2验证 1.实验目的 &#xff08;1&#xff09;OSPFv2 验证的类型和意义。 &#xff08;2&#xff09;配置基于区域的 OSPFv2 简单口令验证和 MD5 验证的方法。 &#xff08;3&#xff09;配置基于链路的 OSPFv2 简单口令验证和 MD5 验证的方法。 2.实验准备 配置…

ssm校园二手交易平台小程序

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【WebLogic】Linux图形化界面创建WebLogic应用域

接上一篇的WebLogic在Linux图形化界面安装&#xff0c;默认勾选域创建 修改默认的域路径&#xff1a; 模板默认即可 为管理员设置用户名&#xff08;默认weblogic&#xff09;和密码 这一步应该就是14.1.2版本的secured production mode&#xff0c;即在创建应用域的时候&…

java poi Excel 文件导入导出常见错误及解决方案

在使用 Apache POI 进行 Excel 文件的导入导出操作时&#xff0c;可能会遇到各种问题。以下是一些常见的错误及其解决方案&#xff1a; 一、文件格式相关问题 1. 文件格式不兼容 问题描述&#xff1a;尝试使用 HSSFWorkbook 读取 .xlsx 文件&#xff0c;或者使用 XSSFWorkbo…

Kubernetes之kube-proxy运行机制分析

一、基础知识 1.Kubernetes再创建服务时会为服务分配一个虚拟IP地址&#xff0c;客户端通过这个虚拟Ip地址来访问服务&#xff0c;而服务则负责将请求转发到后端pod上。 2.上述阐述的过程为一个反向代理的过程&#xff0c;但是这个反向代理和普通的反向代理的区别是它的IP地址是…

5. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Nacos

一、什么是Nacos Nacos 是阿里巴巴开源的一款云原生应用基础设施&#xff0c;它旨在简化微服务架构中服务治理和配置管理的复杂性。通过 Nacos&#xff0c;服务在启动时可以自动注册&#xff0c;而其他服务则可以通过名称来查找并访问这些注册好的实例。同时&#xff0c;Nacos…

鸿蒙接入支付宝SDK后模拟器无法运行,报错error: install parse native so failed.

鸿蒙项目接入支付宝后&#xff0c;运行提示error: install parse native so failed. 该问题可能由于设备支持的 Abi 类型与 C 工程中的不匹配导致. 官网error: install parse native so failed.错误解决办法 根据官网提示在模块build-profile.json5中添加“x86_64”依然报错 问…