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

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. SASS - 使用Sass程序

    SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...

  2. 解决fixed布局里内容不滚动问题

    //注意给父级加上 (1)横向滚动 left:0; right:0; 然后想要横向滚动的话 overflow-x:scroll; overflow-y:hidden; (2)竖直方向滚动top:0;b ...

  3. springboot~不用模板执行html文件

    放到在resources/static目录下,创建目录或html文件,均可.如:

  4. CodeForces - 748D Santa Claus and a Palindrome (贪心+构造)

    题意:给定k个长度为n的字符串,每个字符串有一个魅力值ai,在k个字符串中选取字符串组成回文串,使得组成的回文串魅力值最大. 分析: 1.若某字符串不是回文串a,但有与之对称的串b,将串a和串b所有的 ...

  5. Mac 用终端(命令行)打开vscode编辑器

    1.打开控制面板(⇧⌘P) 2.输入 shell command 在提示里看到 Shell Command: Install ‘code’ command in PATH, 就可以了. 3.使用: c ...

  6. POJ 1200 Crazy Search 字符串的Hash查找

    第一次涉及HASH查找的知识 对于字符串的查找有很多前人开发出来的HASH函数,比较常用的好像是ELF 和 BKDR. 这道题没想到突破点是在于其nc值,告诉你组成字符串的字母种类. 还有用26进制, ...

  7. hash简单题(hdu4907)

    Task schedule 地址:http://acm.hdu.edu.cn/showproblem.php?pid=4907 Problem Description 有一台机器,并且给你这台机器的工 ...

  8. 开发大型项目必备 98%公司都在用的十佳 Java Web 应用框架

    众所周知,工欲善其事,必先利其器.选择一个好的 Web 应用框架就像一把称手的兵器,可以助大家披荆斩棘. 今天就为大家整理了十佳 Java Web 应用框架,并简单讨论一下它们的优缺点. 第一,大名鼎 ...

  9. 吴裕雄--天生自然Linux操作系统:Linux 用户和用户组管理

    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 用户的账号一方面可以帮助系统管理员对使用系统的用户进行 ...

  10. docker---设置镜像加速器

    国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器,国内很多云服务商都提供了国内加速器服务,如: Azure 中国镜像: https://dockerhub.azk8s.cn ...