| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 12/15 从迷宫问题看DFS、BFS -> 正文阅读 |
|
[数据结构与算法]12/15 从迷宫问题看DFS、BFS |
说白了,深搜就是递归的加强版 优先考虑深度,换句话说就是一条路走到黑,直到无路可走的情况下,才会选择回头,然后重新选择一条路 先看看迷宫问题的题目 int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; ????? 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 答案一眼就能看出来是8,但是要计算机去试探、 思?? 路 1、一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。 2、二维数组,起点为a[0][0] 3、在起点的那个人可以往上下左右试探,有一个顺序,可以顺时针,先往右边然后顺时针 4、每走过一个点,都要把那个点设置为已访问,也就是在路上做标记 5、到达下一个点的时候,和起点一样,都要向四个方向试探,如果无路可走则不考虑这个方向 6、第一步和第二步的时候都只能往下一个方向移动,到第三个点位的时候就多了选择,可以向右走也可以向下走,这边先向右走,往终点的方向走,形成第一条路线,路上以访问点的数量就是步数,这只是其中的一条路径,不一定是最短的???????????????????????????????????? 7、试探其他的路径,因此需要回溯,回溯是什么意思呢,并不是瞬移回到起点,而是从刚刚到达的终点往回走,此时路上还有做过的标记,走完一个点,就要把标记给摘掉,这道题没什么死路,如果有遇到死路,就要回退到路口处重新选择,标记不一定要全部摘掉,这些标记可以留下来当作下一条路径的标记 既然学了DFS,为何不用万能的STL容器去存呢 在做出来之前,先扩展一下,C++的STL容器queue 里面有如下可以被调用的函数
定义一个队列之前,需要明确要定义什么队列,例如,结构体 queue<(结构体的名字)> (你定义的队列名字); queue<node> M; 定义一个队列之后最好看一下这个队列是不是空的 队列函数使用样例
这段代码是一个教程转来的 最后我还是用了BFS来写,没想到吧 广度搜索的好处就是能够找出来唯一解 先从最右下到左上用BFS遍历一遍,记录好到达每个节点的步数。 然后反过来,从左上开始搜索。 每次搜索之前记录的步数比当前节点步数少一的点,符合条件的便是要输出的点 废话不多说,直接上代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:38:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |