深度优先搜索(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 安装 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 提…

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;每种物品都有无限的数量可用。…

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

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

实验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;即在创建应用域的时候&…

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”依然报错 问…

安宝特方案 | AR眼镜:远程医疗的“时空折叠者”,如何为生命争夺每一分钟?

行业痛点&#xff1a;当“千里求医”遇上“资源鸿沟” 20世纪50年代&#xff0c;远程会诊的诞生曾让医疗界为之一振——患者不必跨越山河&#xff0c;专家无需舟车劳顿&#xff0c;一根电话线、一张传真纸便能架起问诊的桥梁。然而&#xff0c;传统远程医疗的局限也日益凸显&a…

编译原理面试问答

编译原理面试拷打 1.编译原理的基本概念 编译原理是研究如何将高级程序语言转换为计算机可执行代码的理论与技术&#xff0c;其核心目标是实现高效、正确的代码翻译。 **编译器&#xff1a;**将源代码转化为目标代码&#xff08;机器码、字节码等&#xff09;。一次翻译整个程…

cefsharp131升级132测试(WinForms.NETCore)

一、升级&#xff08;Nuget&#xff09; 版本说明&#xff08;readme&#xff09;:最低.NET Core3.1 (NET5.0) Visual C 2019 Redist 二、试运行、兼容性测试 三、后记说明 支持H264版本推荐版本63,79,84,88,100,111,125&#xff08;支持h264和pdf预览&#xff09; 其他H264版…

打家劫舍3

今天和打家讲一下打家劫舍3 题目&#xff1a; 题目链接&#xff1a;337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为root。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“…

用AI写游戏1——js实现贪吃蛇

使用模型通义千问 提示词&#xff1a; 用js html css 做一个贪吃蛇的动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Snake Game</title><link rel"stylesheet" href"c…

ubuntu24.04安装布置ros

最近换电脑布置机器人环境&#xff0c;下了24.04&#xff0c;但是网上的都不太合适&#xff0c;于是自己试着布置好了&#xff0c;留作有需要的人一起看看。 文章目录 目录 前言 一、确认 ROS 发行版名称 二、检查你的 Ubuntu 版本 三、安装正确的 ROS 发行版 四、对于Ubuntu24…