- 1、本文档共91页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构与算法:Python语言描述栈和队列要点
迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径(而不是找所有的能行路径) 为了找到路径,可能需要逐一探查不同的可能分支 工作中需要缓存信息:如果当前位置存在多个可能探查方向,由于下步只能探查一个,需要把不能立刻处理的方向记下来,后面可能使用 向前搜索也有一些不同方式,可以比较冒进,也可以稳扎稳打 如果搜索还没找到出口,有一些可能做法。例如: 直到无路可走时才考虑其他选择,换一条没走过的路继续 每步都从最早记录的有选择位置向前,检查并保存另一个可达位置 无论如何,路径搜索中必须记录(缓存)有关信息,以供后面使用 迷宫问题 实现不同的路径搜索过程,需要用不同缓存结构保存分支点信息 用栈保存和提供信息,实现的是回到之前最后选择点继续的过程 用队列保存信息,就是总从最早遇到的选择点继续搜索 用栈保存信息,实际上是尽可能利用已经走过的路(改变最少) 下面先考虑实现这一过程的算法。算法里用一个栈保存分支点信息 用队列方式记录信息的可能性后面考虑 解决这个问题需要设计一种问题表示形式和一种确定可行方向的方式 注意:还要防止出现兜圈子的情况,为此需要记录到过的位置 如果不记录试探过的位置,在搜索通路的过程中就有可能重复探查某些局部路径,即使出口是可达的,也永远找不到 记录了探查过的位置,在搜索中检查,保证不重复探查任一位置 两种记录方式:1, 专门保存信息;2, 或直接记在“地图” (迷宫图) 上 迷宫问题 问题求解中的一项关键工作是选择合适的问题表示。这里采用: 一个整数“矩阵”(两层的 list)表示迷宫 入口和出口都用一对表下标表示(位置) 初始时,通路上的点用元素值为 0 表示,非通路点用 1 为避免无穷循环,搜索中把检查过的点标记为2(记录方法 2) 这样,尚未考虑过的通行位置的值是 0,否则都是不需要进一步考虑的(或者根本不是通路,或者是已经探查过的位置) 每个位置有四个相邻位置。为正确(且方便)地处理可能前进方向,要确定一种系统的检查方法。我们把一个位置的四邻看作“东南西北”四方位置,按这个顺序逐方向处理 对单元 (i, j),其相邻的四个位置的数组元素下标如右图所示 N (i-1,j) w (i,j-1) ? (i, j) E (i,j+1) S (i+1,j) 迷宫问题 用一个序对的 list 表示从任一 (i, j) 得到其四邻位置应该加的数对: dirs = [(0,1), (1,0), (0,-1), (-1,0)] 对于当前位置 (i, j),顺序加 dirs[0], dirs[1], dirs[2], dirs[3],就可以得到其东西南北的四个相邻位置 这一设计使检查当前位置四邻的工作可以通过一个循环完成 先定义两个简单的辅助函数(设 pos 是形式为 (i, j) 的序对): def mark(maze, pos): # 给迷宫 maze 的位置 pos 标 2 表示“到过” maze[pos[0]][pos[1]] = 2 def passable(maze, pos): # 检查迷宫 maze 的位置 pos 是否可行 return maze[pos[0]][pos[1]] == 0 先考虑用递归方式写出的算法,它比较简单,不需要辅助数据结构 如前所述,为支持递归执行,语言系统内部实际上有一个运行栈。采用递归的方式描述迷宫搜索,也就是利用这个运行栈 迷宫的递归求解 前面提出了对迷宫求解问题的递归观点,改写如下: 每个时候总有一个当前位置,开始时这个位置是迷宫入口 如果当前位置就是出口,问题已解决 如果从当前位置已无路可走,当前的探查失败 取一个与当前位置相邻的可行位置用同样方式探查,如果从那里有路径通往出口,也就找到了从当前位置到出口的路径 递归的迷宫求解算法是上述描述的实现,开始时把入口作为当前位置 mark 当前位置 检查它是否出口,如果是则成功结束 逐个检查当前位置的四邻是否可以通到出口(递归) 成功时,整个求解也成功 失败时放弃这个可能性 迷宫问题 递归实现的主函数如下: def find_path(maze, start, end): mark(maze, start); if start == end: # 已到达出口 print(start, end= ) # 输出这个位置 return True # 成功结束 for i in range(4): # 否则按四个方向顺序探查 nextp = start[0]+dirs[i][0], s
您可能关注的文档
- 数据库6版讲稿第六章----形式化关系查询语言.ppt
- 数据处理软件Excel 2010.pptx
- 数据库保护.ppt
- 数据库上课 第五讲 SQL语言_2(简单查询与连接).ppt
- 数据处理的基础知识.ppt
- 数据库及程序设计01.pptx
- 数据库上课 第八讲 数据库的安全性与完整性.ppt
- 数据库实验.doc
- 数据库恢复.ppt
- 数据库模式设计及其规范化.ppt
- 专题06 经济体制(我国的社会主义市场经济体制)-五年(2020-2024)高考政治真题分类汇编(解析版).docx
- 专题11 世界多极化与经济全球化-5年(2020-2024)高考1年模拟政治真题分类汇编(解析版).docx
- 专题03 经济发展与社会进步-5年(2020-2024)高考1年模拟政治真题分类汇编(浙江专用)(解析版).docx
- 专题09 文化传承与文化创新-5年(2020-2024)高考1年模拟政治真题分类汇编(北京专用)(原卷版).docx
- 5年(2020-2024)高考政治真题分类汇编专题08 社会进步(我国的个人收入分配与社会保障)(原卷版).docx
- 专题07 探索世界与把握规律-5年(2020-2024)高考1年模拟政治真题分类汇编(解析版).docx
- 5年(2020-2024)高考政治真题分类汇编专题06 经济体制(我国的社会主义市场经济体制)(原卷版).docx
- 专题11 全面依法治国(治国理政的基本方式、法治中国建设、全面推进依法治国的基本要求)-五年(2020-2024)高考政治真题分类汇编(解析版).docx
- 专题17 区域联系与区域协调发展-【好题汇编】十年(2015-2024)高考地理真题分类汇编(解析版).docx
- 专题01 中国特色社会主义-5年(2020-2024)高考1年模拟政治真题分类汇编(原卷版).docx
文档评论(0)