用下面这个简单的迷宫图作为例子:

OXXXXXXX
OOOOOXXX
XOXXOOOX
XOXXOXXO
XOXXXXXX
XOXXOOOX
XOOOOXOO
XXXXXXXO

O为通路,X为障碍物。

深度优先搜索就像是一条路走到黑,走到黑,黑了再回来。有种递归的感觉。

深度优先搜索(DFS)

 #include<iostream>
using namespace std; char a1[] = {'O','X','X','X','X','X','X','X','\0'};
char a2[] = {'O','O','O','O','O','X','X','X','\0'};
char a3[] = {'X','O','X','X','O','O','O','X','\0'};
char a4[] = {'X','O','X','X','O','X','X','O','\0'};
char a5[] = {'X','O','X','X','X','X','X','X','\0'};
char a6[] = {'X','O','X','X','O','O','O','X','\0'};
char a7[] = {'X','O','O','O','O','X','O','O','\0'};
char a8[] = {'X','X','X','X','X','X','X','O','\0'};
char *p[] = {a1, a2, a3, a4, a5, a6, a7, a8}; int offset[][] = {{-, }, {, }, {, -}, {, }};  //偏移量为一位大小,顺序为:上(x-1)、下(x+1)、左(y-1)、右(y+1) void DFS(int x, int y)
{
if(x == && y == )   //找到出口
{
p[x][y] = '*';
cout << "One path of the maze:" << endl;
for(int i = ; i < ; i++)
cout << p[i] << endl;
cout << endl;
}
for(int i = ; i < ; i++)  //寻找可行的路径
{
int nx = x + offset[i][];  //试探可走路径,下一位置为当前位置加上偏移量
int ny = y + offset[i][];
if(nx>= && nx<= && ny>= && ny<= && p[nx][ny]!='X' && p[nx][ny]!='*')  //找到可行路径
{
p[x][y] = '*';  //画出路径
DFS(nx, ny);  //继续搜索
p[x][y] = 'O';  //走不下去了回退
}
}
} int main()
{
cout << "The size of the maze: row 8, col 8" << endl;
cout << "The map: " << endl;
for(int i = ; i < ; i++)
cout << p[i] << endl; DFS(, );
return ;
}

广度优先搜索则是遍历与当前位置相邻的所有可行点,就像是病毒,传播速度很快。一传十,十传百的感觉。
求解时需要与队列相结合。

广度优先搜索(BFS)

 #include<iostream>
#include<cstring>
using namespace std; char a1[] = {'O','X','X','X','X','X','X','X','\0'};
char a2[] = {'O','O','O','O','O','X','X','X','\0'};
char a3[] = {'X','O','X','X','O','O','O','X','\0'};
char a4[] = {'X','O','X','X','O','X','X','O','\0'};
char a5[] = {'X','O','X','X','X','X','X','X','\0'};
char a6[] = {'X','O','X','X','O','O','O','X','\0'};
char a7[] = {'X','O','O','O','O','X','O','O','\0'};
char a8[] = {'X','X','X','X','X','X','X','O','\0'};
char *p[] = {a1, a2, a3, a4, a5, a6, a7, a8}; int offset[][] = {{-, }, {, }, {, -}, {, }};
int vis[][]; //用来标记是否访问过当前位置
int cnt = ; struct Position{
int x, y; //当前位置
int pre; //前驱点
}path[*], myqueue[*]; void BFS()
{
memset(vis, , sizeof(vis));
int front = , rear = ; myqueue[rear].x = ; //入口入队
myqueue[rear].y = ;
myqueue[rear].pre = -;
rear++; Position* tmp;
while(front < rear)
{
tmp = &myqueue[front]; //当前位置出队 if(tmp->x == && tmp->y == ) //到达出口
{
while(tmp->pre != -) //回溯寻找路径
{
path[cnt].x = tmp->x;  //记录可行路径的位置
path[cnt].y =tmp->y;
cnt++;
tmp = &myqueue[tmp->pre];
} for(int i = ; i < cnt; i++)  //在地图中可视化路径
{
p[][] = '*';
p[path[i].x][path[i].y] = '*';
}
cout << "One path of the maze:" << endl;
for(int i = ; i < ; i++)
cout << p[i] << endl;
cout << endl;
break;
} for(int i = ; i < ; i++) //遍历相邻点
{
int nx = tmp->x + offset[i][];  //试探路径
int ny = tmp->y + offset[i][];
if(nx>= && nx<= && ny>= && ny<= && p[nx][ny]!='X' && vis[nx][ny]!=) //满足条件入队
{
vis[nx][ny] = ;
myqueue[rear].x = nx;
myqueue[rear].y = ny;
myqueue[rear].pre = front;
rear++;
}
}
front++;
}
} int main()
{
cout << "The size of the maze: row 8, col 8" << endl;
cout << "The map: " << endl;
for(int i = ; i < ; i++)
cout << p[i] << endl; BFS();
return ;
}

这是一个只有一条通路的迷宫,具体要根据需求进行修改以满足。

深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题的更多相关文章

  1. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  2. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  3. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  4. 深度优先搜索DFS和广度优先搜索BFS

    DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...

  5. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 图的深度优先遍历(DFS)和广度优先遍历(BFS)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  8. 【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  9. 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...

  10. BFS求解迷宫的最短路径问题

    题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是 ...

随机推荐

  1. JavaBean和json数据之间的转换(二)含有date类型的JavaBean

    1.前言 上次讲了简单的JavaBean和json格式之间的转换,代码很简单,但是实际过程中,往往用到的JavaBean都是比较复杂的,其他的字段还好,如果JavaBean中包含了date类型的字段, ...

  2. Django回顾之_03_Model属性及后端配置

    1. Django ORM O(objects):类和对象. R(Relation):关系,关系数据库中的表格. M(Mapping):映射. Django ORM框架的功能: a) 建立模型类和表之 ...

  3. 利用mysecureshell搭建sftp服务

    1.下载对应的mysecureshell-1.33-1.x86_64.rpm包 2.安装mysecureshell-1.33-1.x86_64.rpm 3.添加ftp用户 useradd ftp 4. ...

  4. 【收藏】免费开源好看的bootstrap后台模板

    1.ace admin github:https://github.com/bopoda/acedemo:http://ace.jeka.by/ 2.CoreUI jQuery.Angular.Rea ...

  5. 第一个eclipse maven项目!我超全!

    前言:以前一直用idea做东西,今天突然想试一下,没想到配置起来是真的麻烦!!!!会出现各种各样的问题,太晚了,本文只做出几处非常严重的问题,如有疑问,请私信,留言 准备:本文     JDK 1.8 ...

  6. html标签title属性效果优化

    html标签title属性效果不友好,最致命的是响应慢,体验不好,JQuery-UI提供了很好的支持.在jquery.tip的基础上又做了修改,这样子定制效果更强. 代码如下: <!DOCTYP ...

  7. Python的安装部署

    Python的安装部署 参考:https://www.runoob.com/w3cnote/pycharm-windows-install.html 参考:https://jingyan.baidu. ...

  8. 超级顽固的流方式读取doc,docx乱码问题

    因为工作中需要一个把doc或者docx的office文档内容,需要读取出来,并且也没展示功能.代码中第一考虑可能就是通过读取流方式,结果写了以后,各种乱码,百科的解决方案也是千奇百怪,第一点:可能是文 ...

  9. 基础练习--huffman

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-},用这列数构造Huffman树的过程如下: . 找 ...

  10. idea使用Maven创建的JavaWeb项目新建文件时没有打包到target目录报错

    背景:在使用tomcat发布这个项目时,浏览网页,js没有效果. 问题:发现打包之后没有同步到target里 解决办法:点击最右侧的Maven栏->所建项目->Lifecycle-> ...