(一)深度优先搜索(depth first search(dfs)):
沿着一个方向一直找,直到走不了,回到上一个分支,继续;
dfs:解析
1.将起始点放入path中,并且标记为走过
2.dfs:
步骤:
1.起点存入路径中: 先上下左右
2.递归流程(x.y)
1:判断x,y是否是终点,如果是终点,递归结束
2.遍历x,y周围四个点 xx,yy
{
1.判断xx.yy组成的点是否能走,(不是障碍物,没有走过,没有越界)
2..如果能走,递归XX.YY.组成的点(dfs(xx,yy))
3.递归结束后没有找到路径,将xx,yy组成的点移除出路径
}
3.如果全部递归结束,表示走不通,找不到路
(二)广度/宽度优先搜索(breath first search(bfs)):
bfs解析:
找周围四个方向是否有一点是终点,如果没有,就继续找这四个点的周围四个点;
流程:先查找四个方向,再继续查找某一个方向的4个方向
步骤:
1:将起点添加到路径
int i=0;
2:while(i<路径的长度)
{
1:取出路径的第一个点(x,y)
2:将第一个点从路径中移除
3:判断当前x,y是否是终点,如果是,找到一条路,
4:如果不是终点,将周围四个能走的点加入到路径中
i++;
}
3:
dfs和bfs算法c++实现
1.1:点的结构体
struct Point
{
int x;
int y;
Point(int x, int y)
:x(x),
y(y)
{
}
};
1.2 BFS 构建WayPoint
struct WayPoint
{
int pre;//当前点的上一个分支对应在vector的下标
Point point;//当前点的坐标
WayPoint(int pre, Point point)
:pre(pre),
point(point)
{
}
};
2:定义数据类型
//1.定义一个vector,保存路径
vector<Point> path;
//2.定义一个vector,保存最短路径
vector<Point> minPath;
//3.定义一个最短路径的长度
int minStep = -1;
//上下左右的偏移量
int nextxy[4][2] = {
{
-1, 0 }, {
1, 0 }, {
0, -1 }, {
0, 1 } };
3.:方法函数
3.1:判断某个点是否可以走
bool checkPoint(Map map, Map flagMap, int x, int y)
{
//1.越界
if (x < 0 || x >= map.getRow() || y < 0 || y >= map.getLine())
return false;
//2.走过
if (1 == flagMap.getXY(x, y))
return false;
//3.障碍物
if (1 == map.getXY(x, y))
return false;
return true;
}
3.2dfs深度优先搜索
bool dfs(Map map, Map& flagMap, int x, int y, int endx, int endy)
{
//4.判断是否是终点
if (x == endx && y == endy)
{
return true;
}
//5.遍历周围四个点(上下左右)
for (int i = 0; i < 4;i++)
{
int xx = x + nextxy[i][0];//x
int yy = y + nextxy[i][1];//y
if (checkPoint(map, flagMap, xx, yy))//判断这个点是否走得通
{
//6.将该点放入path,标记为走过
path.