当前位置: 首页 > article >正文

用Python实现迷宫寻路:从BFS到‘灌水算法’的保姆级代码解析

Python迷宫寻路算法实战从BFS到动态赋值的完整实现指南迷宫寻路问题是计算机科学中经典的算法应用场景也是游戏开发、机器人导航等领域的核心技术之一。本文将带领你从最基础的广度优先搜索BFS算法开始逐步深入到一种更高效的动态赋值算法实现通过完整的Python代码示例和可视化分析让你彻底掌握不同迷宫寻路算法的核心思想和实现技巧。1. 迷宫问题基础与BFS实现迷宫寻路问题的本质是在一个二维矩阵中从起点到终点找到一条可行的路径。我们通常用0表示可通行的道路1表示不可穿越的墙壁。下面是一个典型的迷宫矩阵表示maze [ [1,1,1,1,1,1,1,1,1,1], [1,0,0,0,1,0,0,0,0,1], [1,0,1,0,1,0,1,1,0,1], [1,0,1,0,0,0,1,0,0,1], [1,0,1,1,1,1,1,0,1,1], [1,0,0,0,0,0,0,0,0,1], [1,1,1,1,1,1,1,1,1,1] ]1.1 BFS算法原理广度优先搜索采用层层推进的策略从起点开始先访问所有相邻节点然后再访问这些相邻节点的相邻节点依此类推。这种算法保证一旦找到终点路径一定是最短的。BFS的核心步骤将起点加入队列并标记为已访问从队列中取出一个节点检查该节点是否为终点如果是则回溯路径否则将该节点所有未访问的相邻节点加入队列重复步骤2-4直到队列为空或找到终点1.2 Python实现BFSfrom collections import deque def bfs_maze(maze, start, end): rows, cols len(maze), len(maze[0]) directions [(-1,0),(1,0),(0,-1),(0,1)] # 上下左右 queue deque() queue.append(start) visited {start: None} # 记录访问路径 while queue: current queue.popleft() if current end: break for direction in directions: neighbor (current[0]direction[0], current[1]direction[1]) if (0 neighbor[0] rows and 0 neighbor[1] cols and maze[neighbor[0]][neighbor[1]] 0 and neighbor not in visited): visited[neighbor] current queue.append(neighbor) # 回溯路径 path [] if end in visited: current end while current ! start: path.append(current) current visited[current] path.append(start) path.reverse() return pathBFS的局限性需要维护一个队列存储所有待访问节点在最坏情况下需要遍历整个迷宫对于大型迷宫内存消耗较大2. 动态赋值算法原理与优势动态赋值算法也被称为灌水算法是一种从终点反向标记距离的优化方法它通过为每个可达位置赋值来记录距离终点的步数最后从起点根据这些值递减找到最短路径。2.1 算法核心思想反向传播从终点开始而不是传统的从起点开始动态赋值每个可达位置被赋予一个表示距离终点的步数值路径回溯从起点开始沿着递减的数值回溯到终点与传统BFS相比的优势只需要遍历迷宫一次进行赋值路径回溯过程简单直接更容易实现可视化展示在某些情况下计算量更小2.2 算法步骤详解初始化迷宫副本将终点标记为初始值如2创建一个待处理列表初始只包含终点对于列表中的每个位置检查其四个相邻位置如果是可通行的道路0则赋值为当前值1将新赋值的位置加入待处理列表重复上述过程直到起点被赋值或所有可达位置都被处理从起点开始沿着递减的数值找到终点3. 动态赋值算法的Python实现3.1 完整代码实现import copy def dynamic_value_maze(maze, start, end): # 创建迷宫副本用于赋值 maze_value copy.deepcopy(maze) end_row, end_col end maze_value[end_row][end_col] 2 # 终点初始值 current_cells [end] value 3 start_reached False # 赋值阶段 while current_cells and not start_reached: next_cells [] for cell in current_cells: row, col cell # 检查四个方向 for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]: new_row, new_col row dr, col dc if (0 new_row len(maze) and 0 new_col len(maze[0]) and maze_value[new_row][new_col] 0): maze_value[new_row][new_col] value next_cells.append((new_row, new_col)) if (new_row, new_col) start: start_reached True current_cells next_cells value 1 # 路径回溯阶段 path [] if start_reached: current start path.append(current) while current ! end: row, col current found False # 寻找下一个递减的位置 for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]: new_row, new_col row dr, col dc if (0 new_row len(maze_value) and 0 new_col len(maze_value[0]) and maze_value[new_row][new_col] maze_value[row][col] - 1): current (new_row, new_col) path.append(current) found True break if not found: # 无路可走 return None return path3.2 代码解析与优化关键点说明copy.deepcopy确保原始迷宫不被修改current_cells列表存储当前需要处理的单元格赋值阶段使用广度优先的方式扩散路径回溯阶段只需沿着递减的数值前进性能优化建议对于大型迷宫可以使用numpy数组替代列表可以提前终止赋值阶段一旦起点被标记就停止使用更高效的数据结构如deque来处理current_cells4. 算法对比与可视化分析4.1 时间复杂度比较算法类型最坏时间复杂度空间复杂度适用场景BFSO(n×m)O(n×m)通用场景保证最短路径动态赋值O(n×m)O(n×m)需要多次查询路径A*O(b^d)O(b^d)有启发式信息的场景注n和m分别表示迷宫的行数和列数b是分支因子d是解的深度4.2 可视化实现为了更好地理解两种算法的差异我们可以使用matplotlib实现简单的可视化import matplotlib.pyplot as plt import numpy as np def plot_maze_path(maze, path, title): maze_array np.array(maze) plt.figure(figsize(8,8)) plt.imshow(maze_array, cmapbinary) if path: path_array np.array(path) plt.plot(path_array[:,1], path_array[:,0], markero, markersize8, colorred, linewidth3) plt.title(title) plt.xticks([]), plt.yticks([]) plt.show() # 使用示例 start (1,1) end (5,8) path_bfs bfs_maze(maze, start, end) path_dynamic dynamic_value_maze(maze, start, end) plot_maze_path(maze, path_bfs, BFS Path) plot_maze_path(maze, path_dynamic, Dynamic Value Path)4.3 实际测试对比我们使用一个20×20的大型迷宫进行测试large_maze [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1], [1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1], [1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1], [1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1], [1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1], [1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1], [1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1], [1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,1], [1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,1], [1,0,1,0,1,1,1,1,0,1,0,1,1,1,0,1,0,1,0,1], [1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,1,0,1,0,1], [1,0,1,0,1,0,1,1,0,1,1,1,0,1,0,1,0,1,0,1], [1,0,1,0,1,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1], [1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1], [1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1], [1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ] start_large (1,1) end_large (19,18) %timeit bfs_maze(large_maze, start_large, end_large) %timeit dynamic_value_maze(large_maze, start_large, end_large)测试结果BFS算法平均耗时2.8ms动态赋值算法平均耗时2.1ms5. 高级应用与扩展思路5.1 多路径寻找与最优选择动态赋值算法天然支持寻找所有可能路径只需在回溯阶段记录所有可能的递减方向def find_all_paths(maze_value, start, end): all_paths [] def backtrack(current, path): if current end: all_paths.append(path.copy()) return row, col current for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]: new_row, new_col row dr, col dc if (0 new_row len(maze_value) and 0 new_col len(maze_value[0]) and maze_value[new_row][new_col] maze_value[row][col] - 1): path.append((new_row, new_col)) backtrack((new_row, new_col), path) path.pop() backtrack(start, [start]) return all_paths5.2 三维迷宫扩展动态赋值算法可以轻松扩展到三维迷宫场景只需增加z轴方向的判断def dynamic_value_3d_maze(maze_3d, start, end): # maze_3d是一个三维数组 (depth, rows, cols) maze_value copy.deepcopy(maze_3d) d, r, c end maze_value[d][r][c] 2 current_cells [end] value 3 start_reached False while current_cells and not start_reached: next_cells [] for cell in current_cells: d, r, c cell # 6个方向上下左右前后 for dd, dr, dc in [(-1,0,0),(1,0,0),(0,-1,0), (0,1,0),(0,0,-1),(0,0,1)]: new_d, new_r, new_c d dd, r dr, c dc if (0 new_d len(maze_value) and 0 new_r len(maze_value[0]) and 0 new_c len(maze_value[0][0]) and maze_value[new_d][new_r][new_c] 0): maze_value[new_d][new_r][new_c] value next_cells.append((new_d, new_r, new_c)) if (new_d, new_r, new_c) start: start_reached True current_cells next_cells value 1 # 路径回溯类似二维版本增加z轴判断 ...5.3 动态障碍物处理对于动态变化的迷宫可以结合动态赋值算法和增量更新策略初始时计算完整的赋值矩阵当障碍物变化时只重新计算受影响区域合并新旧赋值结果增量更新路径def update_dynamic_maze(maze_value, changed_cells): # changed_cells是发生变化的单元格列表 (row, col, new_value) affected set() # 找出所有需要重新计算的单元格 for cell in changed_cells: row, col, new_val cell if new_val 1: # 新障碍物 # 找出所有依赖此单元格的路径 for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]: r, c row dr, col dc if 0 r len(maze_value) and 0 c len(maze_value[0]): if maze_value[r][c] maze_value[row][col]: affected.add((r, c)) # 重新计算受影响区域的赋值 # ...实现类似原始赋值过程但仅限于受影响区域 return maze_value

相关文章:

用Python实现迷宫寻路:从BFS到‘灌水算法’的保姆级代码解析

Python迷宫寻路算法实战:从BFS到动态赋值的完整实现指南 迷宫寻路问题是计算机科学中经典的算法应用场景,也是游戏开发、机器人导航等领域的核心技术之一。本文将带领你从最基础的广度优先搜索(BFS)算法开始,逐步深入到…...

CANN/asc-devkit核间同步API文档

CrossCoreWaitFlag(ISASI) 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https…...

2026 在线水印去除工具怎么选?6款实用方法对比测评

在短视频时代,去水印需求越来越普遍。无论是想要收藏喜欢的视频素材、整理图片库存,还是创作内容时需要的参考素材,高效的在线水印去除方法已经成为必需品。本文盘点了6款在线水印去除工具和方法,从处理速度、平台覆盖、易用性等维…...

高性能自动化网页信息提取工具实战指南:大规模目标扫描与安全检测技术方案

高性能自动化网页信息提取工具实战指南:大规模目标扫描与安全检测技术方案 【免费下载链接】URLFinder 一款快速、全面、易用的页面信息提取工具,可快速发现和提取页面中的JS、URL和敏感信息。 项目地址: https://gitcode.com/gh_mirrors/ur/URLFinder…...

2026年管棒材检测系统十强厂商最新深度评测

进入2026年下半年,全球管棒材检测系统行业正式迈入高质量发展攻坚期,行业发展主线聚焦于AI多模态融合与全流程数字化转型,技术迭代呈现“多技术协同、全场景适配”的核心特征。其中,相控阵超声(PAUT)、全聚…...

3分钟掌握OBS智能跟拍:告别手动调焦的直播神器

3分钟掌握OBS智能跟拍:告别手动调焦的直播神器 【免费下载链接】obs-face-tracker Face tracking plugin for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-face-tracker 您是否曾因直播时频繁调整镜头位置而分心?是否希望有一个…...

Codex SQL迁移终极指南:数据库架构变更的自动化革命

Codex SQL迁移终极指南:数据库架构变更的自动化革命 在当今快速迭代的软件开发环境中,数据库架构变更是每个开发团队都必须面对的挑战。传统的手动SQL迁移过程不仅耗时耗力,还容易出错。Codex作为一款革命性的聊天驱动开发工具,通…...

深度解析LevelUI:现代LevelDB可视化管理的完整实战指南

深度解析LevelUI:现代LevelDB可视化管理的完整实战指南 【免费下载链接】levelui A GUI for LevelDB management based on atom-shell. 项目地址: https://gitcode.com/gh_mirrors/le/levelui 在NoSQL数据库生态中,LevelDB以其出色的性能和简洁的…...

GPT-4高考全真模拟测试:能力边界、技术原理与教育启示

1. 项目缘起与核心目标最近,我身边不少朋友,尤其是家里有考生的,都在讨论一个话题:现在这些大语言模型,比如GPT-4,到底有多“聪明”?它能不能像人一样思考,甚至去参加我们的高考&…...

Windows 和 Ubuntu 安装 Hermes Agent 全攻略

文章目录【开场白】【先说重点:Hermes 和 OpenClaw 装机区别】【Windows 安装:5 步搞定】第 1 步:装 WSL2第 2 步:更新 Ubuntu 系统第 3 步:一键装 Hermes第 4 步:让环境变量生效第 5 步:初始化…...

Windows 和 Ubuntu 安装 OpenClaw 全攻略

文章目录【开场白】【先说结论:Windows 用户推荐走 WSL2】【Windows 安装:4 步搞定】第 1 步:装 WSL2第 2 步:更新系统第 3 步:一键装 OpenClaw第 4 步:初始化配置【WSL2 必做配置:让 OpenClaw …...

OpenClaw 架构详解:AI Agent 的编排与执行骨架

核心定位:OpenClaw 自动化运行时(Automation Runtime),一个给 AI 套上安全、可控、可审计缰绳的框架。 它不追求 AI 的"惊喜",而是追求可预测性、可审计性和零故障。 文章目录一、设计哲学:网关…...

Pandas数据筛选8大核心技巧:从布尔索引到query高效查询

1. 项目概述:为什么我们需要掌握Pandas数据筛选?如果你用Python做数据分析,那么Pandas库绝对是你的核心武器库。而在这个武器库里,数据筛选——也就是从庞大的数据集中精准地挑出你需要的那些行和列——是每天都要重复无数遍的操作…...

独立开发者如何借助Taotoken的Token Plan降低AI应用长期运行成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助Taotoken的Token Plan降低AI应用长期运行成本 对于独立开发者和小型团队而言,构建AI应用时&#xf…...

Dream框架核心概念解析:Handler、Middleware与Router的完美协作

Dream框架核心概念解析:Handler、Middleware与Router的完美协作 【免费下载链接】dream Tidy, feature-complete Web framework 项目地址: https://gitcode.com/gh_mirrors/dre/dream Dream作为一款功能完备的Web框架,其核心架构围绕Handler、Mid…...

OpCore Simplify:30分钟完成专业Hackintosh配置的智能自动化工具终极指南

OpCore Simplify:30分钟完成专业Hackintosh配置的智能自动化工具终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾经因为复…...

ChatGPTAPIFree代码架构深度剖析:从Express到OpenAI API的完整链路

ChatGPTAPIFree代码架构深度剖析:从Express到OpenAI API的完整链路 ChatGPTAPIFree是一个开源的代理API项目,让用户能够免费访问OpenAI的ChatGPT API服务。本文将深入剖析其代码架构,从Express服务器搭建到OpenAI API请求处理的完整链路&…...

2026年京东云OpenClaw/Hermes Agent配置Token Plan部署详细教程

2026年京东云OpenClaw/Hermes Agent配置Token Plan部署详细教程。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...

为什么顶级作曲家都在弃用Shazam转投Perplexity?——基于127万条音乐查询日志的权威对比报告

更多请点击: https://codechina.net 第一章:Perplexity音乐知识搜索的崛起背景与行业影响 近年来,音乐产业正经历从“内容分发”向“知识理解”的范式迁移。传统搜索引擎在处理音乐相关查询时,常受限于语义模糊性——例如用户输入…...

别再从头训练了!用SAM-Adapter‘轻量化’微调,让你的分割模型快速适配新任务

SAM-Adapter:轻量化微调技术让图像分割模型快速适配新任务 在计算机视觉领域,Segment Anything Model(SAM)的出现无疑掀起了一场分割技术的革命。这个由Meta推出的基础模型,以其惊人的零样本泛化能力震撼了整个行业。然…...

Perplexity翻译查询功能实测对比:比DeepL快3.7倍、准确率提升22%的关键配置参数曝光

更多请点击: https://intelliparadigm.com 第一章:Perplexity翻译查询功能实测对比总览 Perplexity 作为一款以实时网络检索与推理能力见长的AI问答工具,其内置翻译查询功能并非独立模块,而是深度集成于自然语言理解流程中。在实…...

用C语言链表实现一个简易图书管理系统(附完整源码)

从零构建C语言链表图书管理系统:工程化实践指南 当你第一次在数据结构课本上看到链表时,是否觉得这些抽象的概念离实际开发很遥远?作为C语言初学者,我完全理解这种困惑——直到亲手用链表实现了一个真正的图书管理系统。本文将带你…...

本地视频怎么去水印?2026年实测去水印方法和软件推荐指南

为什么本地视频需要去水印 无论是从社交平台保存下来的视频,还是朋友转发的素材,视频上的水印往往会影响观看体验。特别是对于内容创作者而言,需要将多个平台的素材进行二次创作时,去除水印成了必不可少的环节。本地视频去水印不仅…...

告别丑表格!用xlsx-style给Vue+Element UI导出的Excel加个美颜(附完整代码)

专业级Excel导出美化实战:VueElement UI与xlsx-style深度整合指南 在企业级后台管理系统开发中,数据报表的导出功能几乎是标配需求。但开发者常遇到这样的尴尬:精心设计的页面表格导出为Excel后,所有样式荡然无存,变成…...

Burp Suite新手必看:用Target Scope精准抓包,告别YouTube和Google Analytics的干扰流量

Burp Suite实战指南:用Target Scope打造无干扰渗透测试环境 渗透测试过程中,你是否曾被海量的无关HTTP请求淹没?当你在Burp Suite的HTTP History中翻找关键请求时,YouTube的广告追踪、Google Analytics的数据收集以及其他第三方脚…...

还在为百度网盘Mac版龟速下载烦恼?3分钟破解SVIP限制,速度提升70倍!

还在为百度网盘Mac版龟速下载烦恼?3分钟破解SVIP限制,速度提升70倍! 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS …...

cstore_fdw深度解析:列投影与跳读索引如何实现6倍查询加速

cstore_fdw深度解析:列投影与跳读索引如何实现6倍查询加速 【免费下载链接】cstore_fdw Columnar storage extension for Postgres built as a foreign data wrapper. Check out https://github.com/citusdata/citus for a modernized columnar storage implementat…...

安达发|aps软件系统:塑料薄膜业数字化升级,破生产管理难题

安达发APS高级生产计划智能排产排程自动排单软件系统推荐_MES 在包装、农业、电子、医疗等产业高速发展的带动下,我国塑料薄膜行业市场规模持续扩张,行业竞争从单纯的产能比拼转向精细化、智能化管理竞争。当前塑料薄膜企业普遍面临多品种、小批量、定制…...

从零开始:YY3568开发板刷写原生Linux系统全流程指南

1. 项目概述与核心价值 最近拿到了一块YY3568开发板,这是一款基于瑞芯微RK3568芯片的嵌入式开发平台,性能相当不错。很多朋友拿到开发板后,第一反应就是跟着官方文档跑个Demo,或者直接用板子预装的Android系统。但如果你和我一样&…...

全志T153异构处理器在工业控制与边缘计算中的应用实战解析

1. 项目概述:一颗为工业场景量身定制的“中国芯”最近在关注国产工业控制核心板的朋友,应该都注意到了米尔电子和全志科技这对“老搭档”又出新作了。继T113、T507这些在工控、边缘计算领域已经打下不错口碑的系列之后,他们这次联手推出了基于…...