深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题
用下面这个简单的迷宫图作为例子:
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)求解迷宫问题的更多相关文章
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- 深度优先搜索DFS和广度优先搜索BFS
DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...
- BFS求解迷宫的最短路径问题
题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是 ...
随机推荐
- decltype关键字
decltype用于编译时类型推导,是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值. decltype的用法: //推导出表达式类型 ; decltype( ...
- input自动填入密码以后变成白色和黄色的解决办法
问题描述: 1.谷歌自动输入账号密码以后颜色变成黄色: 解决办法: 加样式: input:-webkit-autofill { background: red !important; color: # ...
- hook键盘钩子 带dll
library Key; uses SysUtils, Classes, HookKey_Unit in 'HookKey_Unit.pas'; {$R *.res} exports HookOn,H ...
- CSS3新特性—过渡、转换
过渡 转换 2D转换 2D转换包括四个方面:位移,缩放,旋转,倾斜 位移[让元素移动位置] transform: translate(100px,100px); 备注: 1. 如果只设置一个值,那么代 ...
- 吴裕雄--天生自然 PHP开发学习:数组排序
<?php $cars=array("Volvo","BMW","Toyota"); sort($cars); print_r($ca ...
- NiFi_Demo_调度示例
1.背景 要求:每天凌晨1:00后开始每2min执行一次sql查询 2.作业编排 3.各模块配置 3.1 GenerateFlowFile 作用:用于产生flowfile,该flowfile内容为空. ...
- 调度算法FCFS、SJF和优先权调度的介绍和例题
调度算法 一.先来先服务FCFS (First Come First Serve) 1.思想: 选择最先进入后备/就绪队列的作业/进程,入主存/分配CPU 2.优缺点 优点:对所有作业/进程公平,算法 ...
- leetcode 690.员工的重要性
题目: 给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id. 比如,员工1是员工2的领导,员工2是员工3的领导.他们相应的重要度为15, 10, 5.那么员工1的数据结 ...
- 109.大型的csv文件的处理方式
HttpResponse对象将会将响应的数据作为一个整体返回,此时如果数据量非常大的话,长时间浏览器没有得到服务器的响应,就会超过默认的超时时间,返回超时.而StreamingHttpResponse ...
- 题解 LOJ-6485 【LJJ学二项式定理】
题目 由于看到正解的单位根反演过于复杂 (也就是看不懂) 所以自己构造了一个算法,理论上这个算法应该还有成长的空间(可以变得普适性更强) 不知道和单位根反演有没有一样,就发表出来了 反正转载前记得要联 ...