广度寻路算法C++实现

广度寻路和深度寻路算法是两种常用的图形搜索算法,当然这里的寻路,是指在一个二维平面上,我们将平面划分为许多个方格,给定目的地和起始地,寻找到一条起点到终点之间的路径。广度寻路算法能找到最短路径,而深度寻路算法并不保证找到的路径是最短的路径。但由于广度寻路算法中的循环嵌套比较多,耗费资源大,因此广度寻路算法更适合用于小一点的地图场景。而深度寻路算法就更适合开阔的大地图。
本篇文章来介绍广度寻路算法,有关深度寻路算法的之后再更。
所谓广度寻路,就是将起点作为根节点构造一棵树,每个结点的孩子结点就是这个结点代表的位置能到达的位置。比如下面这个地图:


红色方框是起点,蓝色方框是终点,深红色的区域代表障碍物无法通行。起点的坐标设为(0,0),那么起点的孩子结点就只有(0,1),也就是它下面那个方框,因为这个起点能到达的只有这一个地方。以此类推(0,1)的孩子结点就是(1,1)和(0,2)。
按照这个思路构建树的过程中,当我们遍历到终点时,就意味着起点到终点的路径出现了。我们的树结构中,每个结点都有指向自己父节点的指针,根据这个指针我们可以从终点找到回去的“路”。另外在树的遍历过程中,需要理解“层”的概念,因为我们是一层一层的进行遍历整颗树的,为了方便直接用一个容器vector来存放一个结点的所有子节点,这样做可以省去许多指针操作,毕竟每个结点的子节点数量并不相同。
实现代码如下:

// 广度寻路算法.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <string.h>
#include <vector>
using namespace std;#define ROWS   10
#define COLS   10struct MyPoint{int row;int col;
};struct pathNode{int       val;        //地图上的值bool isFind;     //是否走过
};//树节点
struct treeNode{MyPoint             pos;treeNode*           pParent;//指向父节点的指针vector<treeNode*>   child;  //存储指向所有孩子节点指针的容器
};//能走返回true 否则返回false
bool canWalk(pathNode pathMap[ROWS][COLS], MyPoint pos);int _tmain(int argc, _TCHAR* argv[])
{//1. 地图int map[ROWS][COLS] = {{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }};//2 起点和终点MyPoint begPos = { 0, 0 };MyPoint endPos = { 0, 9 };//3 辅助地图pathNode pathMap[ROWS][COLS] = { 0 };for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){pathMap[i][j].val = map[i][j];}}//4 准备一颗树,起点成为树根节点treeNode* pRoot = NULL;//准备树pRoot = new treeNode;//开内存
#if 1memset(pRoot, 0, sizeof(treeNode));//全部置空pRoot->pos = begPos;
#elsepRoot->pos = begPos;pRoot->pParent = NULL;
#endif//5 标记起点走过pathMap[begPos.row][begPos.col].isFind = true;//6 寻路MyPoint temp;//当前节点treeNode* pCurrent = NULL;//新节点treeNode* pChild = NULL;//当前层vector<treeNode*> currentBuff;//下一层vector<treeNode*> nextBuff;bool isFindEnd = false;currentBuff.push_back(pRoot);while (1){//一层一层变化nextBuff.clear();//清空数组for (int i = 0; i < currentBuff.size(); i++){//遍历当前层pCurrent = currentBuff[i];for (int j = 0; j < 4; j++){//四个方向找相邻节点temp = pCurrent->pos;switch (j){case 0://上temp.row--;break;case 1://下temp.row++;break;case 2://左temp.col--;break;case 3://右temp.col++;break;}if (canWalk(pathMap,temp)){//能走//创建新节点pChild = new treeNode;memset(pChild, 0, sizeof(treeNode));pChild->pos = temp;//新节点入树pCurrent->child.push_back(pChild);   //新节点成为当前节点的孩子pChild->pParent = pCurrent;           //当前节点成为新节点的父//标记走过pathMap[temp.row][temp.col].isFind = true;//新节点进入下一层nextBuff.push_back(pChild);//是否是终点if (temp.row == endPos.row &&temp.col == endPos.col){isFindEnd = true;break;}}}if (isFindEnd) break;}if (isFindEnd) break;//整个地图都遍历完毕,也没有找到终点if (nextBuff.size() == 0) break;currentBuff = nextBuff;//当前层变化}if (isFindEnd){printf("找到终点啦!\n");printf("path:");while (pChild){printf("(%d,%d) ", pChild->pos.row, pChild->pos.col);pChild = pChild->pParent;}printf("\n");}while (1);return 0;
}//能走返回true 否则返回false
bool canWalk(pathNode pathMap[ROWS][COLS], MyPoint pos){//不在地图范围内if (pos.row < 0 || pos.col >=COLS || pos.row >= ROWS || pos.col < 0) return false;//走过if (pathMap[pos.row][pos.col].isFind) return false;//是障碍if (pathMap[pos.row][pos.col].val) return false;return true;
}

广度寻路算法C++实现相关推荐

  1. Day9:寻路算法之BFS广度寻路算法

    一.相关概念: 深度寻路算法:     一个点一条线去找,死胡同则回退     不一定能找到最短路径     优点:         没有循环     缺点:         不一定能找到最短路径 广 ...

  2. 探索迷局:解密广度寻路算法

    ================================ 专栏文章,自下而上 数据结构与算法--二叉搜索树 数据结构与算法--深度寻路算法 数据结构与算法--二叉树+实现表达式树 数据结构与算 ...

  3. 寻路算法 --- 广度寻路算法

    深度寻路:一个个去试,空旷地形 广度寻路:和深度寻路算法思想截然不同,不是一个个去试,而是依次展开:同样是从起点开始,看周围有哪些可以走的,依次去建立一棵树[ 只有四个方向:四叉树 ],总有一个地方, ...

  4. 关于A*寻路算法的认识

    最近要参加学校的APP比赛,我们组做的是一个3D迷宫的小APP,我负责的是迷宫的生成与寻路. 寻路算法选择的是A*寻路算法,具体参考的是下面的这篇博客. 本文主要是谈谈自己对A*算法的理解,具体细节, ...

  5. 地图信息,障碍判断以及寻路算法(A星算法,B星算法和蚁群算法等)

    一.广度优先遍历和深度优先遍历 在学习寻路算法之前,我们先来了解一下广度优先遍历和深度优先遍历. 什么是广度优先遍历? 广度优先遍历(breadth first search)是一个万能的算法. 广度 ...

  6. 寻路算法 --- 深度寻路算法

    深度寻路:大地图 空旷地形 适用于不一定要找到最佳路径的情况  尽量每个角落都走遍 广度寻路:不需要回退 一定能找到最佳路径 循环多 小地图 #include <iostream> usi ...

  7. 数据结构学习第十八课(寻路算法之深度寻路)

    寻路算法 /* 寻路算法: 找路径1 深度寻路:不一定能找到最短路径,回退,循环较少,步骤简单,适用于空旷地图;只能走直线 2 广度寻路:一定能找到最短路径,不需要回退,循环较多,步骤复杂,适用于较小 ...

  8. 寻路算法(BFS,DFS, A*寻路)

    博主真的有段时间没写博客了,主要这段时间在练内功(算法和数据结构),因此就没有写博客了.这次用两个小时写出了寻路算法,算是对之前博主学习进程的一个交待吧. 我们回归正题,BFS和DFS是我们遍历链表树 ...

  9. 那些游戏中的寻路算法

    在游戏中,AI人物的移动往往有许多种实现方法,本文主要列出其中的几种常见的2D寻路方法并附上完整源代码,供读者参考,批评以及指正. 所有的代码均在Unity下完成,并通过测试可以使用. Depth-F ...

最新文章

  1. 计算机算法设计与分析之----- 递归与分治策略
  2. The world at your fingertips — 天涯明月刀幕后24(疏离)
  3. 编程开发之--java多线程学习总结(2)同步代码块
  4. 793. 阶乘函数后K个零 golang
  5. 键盘与鼠标器是微型计算机上最常用的,2016年职称计算机考试WindowsXP考前预测试题5...
  6. kibana数据导入导出_MySQL数据库批量导出和导入查询数据
  7. [转载] C语言C++指针与java中引用的一点对此
  8. C语言判断文件编码格式
  9. 简单的解决idea tomcat run正常debug报错
  10. 华为CE6870固件升级 更新补丁操作
  11. 乌班图系统安装谷歌浏览器
  12. 环境影响评价期末考试题库
  13. 【密码学原理与实践】(五)希尔密码
  14. QTcpServer. QTcpSocket. QUdpSocket之间的区别
  15. 中国运营商IP范围 路由表
  16. 用FAI制作debian自动安装盘
  17. java从学号中提取班级_如何实现表间查询并提取班级号
  18. 月均200wUP主活跃的B站涨粉密码是什么?
  19. CCCP(convex-concave procedure)优化算法的一些理解
  20. “90后”女大学生奇怪 白毛女为何不嫁黄世仁

热门文章

  1. 分公司能与员工签劳动合同么
  2. 战斗服务器响应超时 是否尝试重连,绝地求生刺激战场瞬间落地bug操作方法技巧解析...
  3. The Men Who Stole the World
  4. 饿了么和口碑合并,阿里与美团死磕新零售
  5. java音乐系统实验报告_java程序设计课程设计报告音乐播放器.docx
  6. java中的toarray_java中的toArray()
  7. 高职信息安全比赛攻防思路_2019全国职业院校技能大赛高职组信息安全管理与评估赛项在汉举行...
  8. mysql学习笔记(六)
  9. Linux常用命令 实用命令万字总结
  10. 英语听力练习的基本法则