循迹智能车和迷宫最短路径学习思考
最近在做一个智能迷宫循迹题目之前没有接触过相关的内容。内部有一个任务大致要求为在一个封闭式的迷宫中先自行运行一遍然后在第二遍运行时放置位置后不再进行额外的其他干预小车自己要行驶到指定地点。迷宫生成逻辑大致是上述图片黑色线为墙红色线为循迹线红色线之间间隔相同其实本来这个问题应该是考第一遍小车运行生成图像的能力。我一开始的想法就是将其抽象成一个二维数组用01来表示墙壁和循迹线。在此基础上我想到了去缩短行驶路程然后就想到了之前刷dy刷到的电脑鼠比赛想起来里面有一个什么算法可以计算最短路径就去了解了一下也就是泛洪算法(flood fill)但是我一开始搜出来的都是对区域进行填充最终输出的结果仅仅有被填充没被填充无法填充的三元情况。这样的效果没有办法实现我想要的最短路径。最终我想到了一种办法去实现模子还是泛洪算法但是我为水流加上了“权重”首先还是上面这种地图进行抽象后的二维数组地图比如17*17首先终点是确定的。我随便选定一个起点然后以这个点向四周进行泛洪“。void flood_fill(int x1,int y1,int img[][17],uint8_t a){ uint8_t left a,right a,up a,down a; if(x10||x116||y10||y116)return; img[x1][y1] aimg[x1][y1]?a:img[x1][y1]; if(x1-1!0)flood_fill(x1-1,y1,img,left-1); if(x11!0)flood_fill(x11,y1,img,right-1); if(y11!0)flood_fill(x1,y11,img,up-1); if(y1-1!0)flood_fill(x1,y1-1,img,down-1); }其中的这一句就是本次思路的核心img[x1][y1] aimg[x1][y1]?a:img[x1][y1];我的思路是对任意一个单元格分析时其本身有一个值成为元单元格然后向四周流动时四周可流动单元格存储的值是元单元格的值减一。并且四周可流动的值会在每次流动的行为中时刻更新自己的值为接收到的最大值。比如有一个格子相邻一个值为244和一个值为210的格子则该格子的最终值是243。通过这个思路最终可以实现的效果时对于任意一个非起始格子周围一定有一个比自己值大一的单元格而按照这个逻辑递归下去最终一定可以有一条链接该单元格和最初单元格最初单元格有最大值的道路并且这条逐步加1的路是二者之间的最短路径因为一旦有步数更少的路径则该点的值将会更大固最后形成的地图任意选定终点和起点按照递增的逻辑回退一定可以找到最短路径。下面是我让AI简单写了一个迷宫生成函数内部泛洪算法使用我的逻辑地图和终点随机生成起点可以自己选。不过还比较简陋比如迷宫的大小是固定的在最后循迹完成后其实可以将最短路径高亮显示等等。import tkinter as tk from tkinter import messagebox import random # 常量配置 GRID_NUM 17 # 17x17网格 CELL_PX 38 # 每个格子像素大小 COLOR_WALL black # 墙/边界颜色 COLOR_PATH white # 通路颜色 COLOR_TEXT #0066cc # 数值文字颜色 COLOR_END red # 终点标记色 COLOR_START green # 起点标记色 # 四个方向上、下、左、右和你C代码方向对应 DIRS [(-1, 0), (1, 0), (0, -1), (0, 1)] # 1. 随机迷宫生成DFS回溯法保证连通 def generate_random_maze(): # 0墙1通路初始全是墙 maze [[0] * GRID_NUM for _ in range(GRID_NUM)] # 跳格挖墙法奇数坐标为通路格偶数坐标为墙格 def dfs(x, y): maze[x][y] 1 # 随机打乱方向保证迷宫随机 random.shuffle(DIRS) for dx, dy in DIRS: nx x dx * 2 ny y dy * 2 # 只在内部1~15范围生成 if 1 nx GRID_NUM - 1 and 1 ny GRID_NUM - 1 and maze[nx][ny] 0: # 挖开中间的墙 maze[x dx][y dy] 1 dfs(nx, ny) # 从(1,1)开始生成迷宫 dfs(1, 1) return maze # 2. WFA加权洪水填充和你C语言逻辑完全一致 def wfa_flood(maze, start_x, start_y): # 初始化泛洪地图全0 img [[0] * GRID_NUM for _ in range(GRID_NUM)] # 起点是墙直接返回 if maze[start_x][start_y] 0: return None # 手动栈实现迭代泛洪对应你C语言迭代版无递归 stack [] stack.append((start_x, start_y, 255)) # 起点初始值255 while stack: x, y, val stack.pop() # 越界跳过 if x 0 or x GRID_NUM or y 0 or y GRID_NUM: continue # 是墙跳过 if maze[x][y] 0: continue # 核心逻辑只存最大值新值不大于旧值直接剪枝 if val img[x][y]: continue # 更新当前格子 img[x][y] val next_val val - 1 if next_val 0: continue # 四个方向扩散 for dx, dy in DIRS: stack.append((x dx, y dy, next_val)) return img # 3. 界面绘制 def draw_canvas(canvas, maze, imgNone, end_posNone, start_posNone): canvas.delete(all) # 画格子 for x in range(GRID_NUM): for y in range(GRID_NUM): fill_color COLOR_WALL if maze[x][y] 0 else COLOR_PATH canvas.create_rectangle( y * CELL_PX, x * CELL_PX, (y 1) * CELL_PX, (x 1) * CELL_PX, fillfill_color, outline#cccccc ) # 画泛洪数值 if img is not None and maze[x][y] 1 and img[x][y] 0: canvas.create_text( y * CELL_PX CELL_PX // 2, x * CELL_PX CELL_PX // 2, textstr(img[x][y]), fillCOLOR_TEXT, font(Arial, 9) ) # 标记终点红框 if end_pos: ex, ey end_pos canvas.create_rectangle( ey * CELL_PX 3, ex * CELL_PX 3, (ey 1) * CELL_PX - 3, (ex 1) * CELL_PX - 3, outlineCOLOR_END, width3 ) # 标记起点绿框 if start_pos: sx, sy start_pos canvas.create_rectangle( sy * CELL_PX 3, sx * CELL_PX 3, (sy 1) * CELL_PX - 3, (sx 1) * CELL_PX - 3, outlineCOLOR_START, width3 ) # 4. 主界面逻辑 class MazeWfaApp: def __init__(self, root): self.root root self.root.title(WFA加权洪水填充 迷宫验证工具) self.maze None self.img_map None self.end_pos None self.start_pos None # 顶部控制区 ctrl_frame tk.Frame(root) ctrl_frame.pack(pady8) tk.Label(ctrl_frame, text起点坐标(x,y):).grid(row0, column0, padx5) self.entry_start tk.Entry(ctrl_frame, width10) self.entry_start.insert(0, 1,1) self.entry_start.grid(row0, column1, padx5) btn_gen tk.Button(ctrl_frame, text生成新迷宫, commandself.new_maze) btn_gen.grid(row0, column2, padx8) btn_run tk.Button(ctrl_frame, text运行泛洪算法, commandself.run_wfa) btn_run.grid(row0, column3, padx8) # 画布 canvas_size GRID_NUM * CELL_PX self.canvas tk.Canvas(root, widthcanvas_size, heightcanvas_size, bgwhite) self.canvas.pack(padx10, pady5) # 初始生成一次 self.new_maze() def new_maze(self): self.maze generate_random_maze() self.img_map None self.start_pos None # 随机选一个通路作为终点 path_cells [] for x in range(1, GRID_NUM - 1): for y in range(1, GRID_NUM - 1): if self.maze[x][y] 1: path_cells.append((x, y)) self.end_pos random.choice(path_cells) draw_canvas(self.canvas, self.maze, end_posself.end_pos) def run_wfa(self): try: input_text self.entry_start.get().strip() x, y map(int, input_text.split(,)) except: messagebox.showerror(输入错误, 请输入格式x,y 例如8,8) return if not (1 x 15 and 1 y 15): messagebox.showerror(坐标错误, 坐标范围1~15) return if self.maze[x][y] 0: messagebox.showerror(起点错误, 该位置是墙无法作为起点) return self.start_pos (x, y) self.img_map wfa_flood(self.maze, x, y) draw_canvas(self.canvas, self.maze, self.img_map, self.end_pos, self.start_pos) if __name__ __main__: root tk.Tk() app MazeWfaApp(root) root.mainloop()这是一个运行结果红框为终点起点选择为11.按照165逐步加一的顺序往回推即可找到链接终点和起点的最短路径。就这样做一个学习记录

相关新闻

【Linux系统】06 进程概念

【Linux系统】06 进程概念

目录 ​编辑 1 冯・诺依曼体系结构 2 操作系统 (OS) 定位 2.1 广义与狭义操作系统 2.2 OS 两大目标 2.3 系统调用 & 库函数 3 进程基础概念 & PCB (task_struct) 3.1 什么是进程 3.2 PCB task_struct(Linux 的进程控制块) 3.3 查看进程…

2026/10/12 4:54:53 阅读更多 →
年终奖不发之后:绩效目标、系数规则与激励修复策略

年终奖不发之后:绩效目标、系数规则与激励修复策略

一进十二月,办公室的气温就跟着年终奖的消息一起浮动。今年我们公司的情况很直接:官方通知就一句话——“鉴于今年公司销量、利润率等指标未达成年终目标,所以今年没有年终激励奖”。没有展开解释,没有缓冲余地,消息一…

2026/10/12 4:54:53 阅读更多 →
【Linux系统】05 Linux开发工具(下)

【Linux系统】05 Linux开发工具(下)

目录 1 make 与 Makefile 自动化构建 1.1 为什么需要 Makefile 1.2 Makefile 基础规则 1.3 make 工具推演执行逻辑 1.4 伪目标 .PHONY 1.5 Makefile 进阶语法 自定义变量 三大自动变量(高频面试) wildcard 通配符 后缀替换 模式规则 %.o:%.c …

2026/10/12 4:54:53 阅读更多 →

最新新闻

mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升

mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升

2026年10月10日,mediamtx 发布 v1.21.2 最新版本。本次更新以“修复与改进”为主,覆盖通用逻辑、API、Media-Over-QUIC、RTSP、RTMP、HLS、WebRTC 以及依赖库升级等多个方向。 v1.21.2 没有引入新的功能模块,而是集中处理实际运行中可能出现的…

2026/10/12 5:43:21 阅读更多 →
哪个品牌密码锁最安全 高端市场占比领先全维安防更靠谱安心

哪个品牌密码锁最安全 高端市场占比领先全维安防更靠谱安心

在智能家居全面普及的今天,智能密码锁已经成为了家庭安全防护的核心入口。哪个品牌密码锁最安全,不仅关乎家庭财产安全,更影响着日常进出的便捷体验与全场景安防体验。2026年以来,国内智能门锁行业技术迭代加速,市场格…

2026/10/12 5:43:21 阅读更多 →
2026家用智能锁品牌推荐:德施曼热门产品深度解析

2026家用智能锁品牌推荐:德施曼热门产品深度解析

随着智能家居行业的快速发展,智能门锁已经成为了千家万户的入户安防首选。相较于传统机械锁,智能门锁不仅提供了更加便捷的多种解锁方式,还集成了猫眼可视、AI安防、远程对讲等功能,全方位提升家庭入户安全与使用体验。在2026年上…

2026/10/12 5:43:21 阅读更多 →
本地化企业知识库方案拆解:8 步把文档变成知识库

本地化企业知识库方案拆解:8 步把文档变成知识库

## 背景在项目复盘场景里,企业文档散落各处、找人问半天是效率的主要损耗点。## 核心能力- 全程本地运行,原始文档与知识数据不出电脑- 8 步流水线自动化:解析→结构化→质检→复核→分片→向量库→验收- 内置本地大模型,离线推理…

2026/10/12 5:43:21 阅读更多 →
81 极物科技 | KNX调试 - 个体地址过滤与报文隔离

81 极物科技 | KNX调试 - 个体地址过滤与报文隔离

极物科技 | KNX调试 - 个体地址过滤与报文隔离 前言 工程品质是 KNX 国际标准三十年立足全球的根基,而可观测性是品质的前提。 报文追踪把“看不见的总线”变成“看得见的证据”:每一次收发都有记录、每一次异常都有据可查。本文围绕报文追踪的接收链路、…

2026/10/12 5:43:21 阅读更多 →
百万级缺陷样本开源:工业视觉的「地基」被补上了

百万级缺陷样本开源:工业视觉的「地基」被补上了

1.工业质检的两道坎 ▍坎一:数据各管各的现成的工业缺陷数据集,几乎都窝在单一行当里。VisA、3CAD 盯着 3C 电子,PKU-GoodsAD 盯着包装,Real-IAD、MulSen-AD 盯着材料。覆盖面稍宽些的 VISION、MVTec AD、MMAD,又卡在…

2026/10/12 5:42:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →