深度寻路:一个个去试,空旷地形

广度寻路:和深度寻路算法思想截然不同,不是一个个去试,而是依次展开:同样是从起点开始,看周围有哪些可以走的,依次去建立一棵树[ 只有四个方向:四叉树 ],总有一个地方,树会到达终点,最终这棵树会遍布整个地图,1. 到达终点,直接结束  2. 等整个地图都找完了,没有地方拓展了,再循环结束-> 树会记录从起点到每一个点的路径-> 可以找到多条路

不需要回退,一定能找到最佳路径 因为总是需要去拓展,循环次数会变得很多:消耗时间长,适合小地图,非空旷地形

注意:要弄一个容器去存储当前层,因为某一层可能不止一个,可能有好多个

#include <iostream>
#include <vector>
using namespace std;
//Y   竖着
#define ROWS  10
//X   横着
#define COLS  10
//4个方向都需要去找一遍-> 不需要有试探方向-> 辅助地图为bool类型 找过的不管,没找过的就去试一下
enum direct{ p_up, p_down, p_left, p_right };
class MyPoint{
public:int row, col;friend bool operator==(const MyPoint& p1, const MyPoint& p2);
};
bool operator==(const MyPoint& p1, const MyPoint& p2){if ((p1.row == p2.row) && (p1.col == p2.col)) return true;return false;
}//准备一棵树
struct treeNode{MyPoint             pos;      //点treeNode*          pParent;  //指向父节点的指针vector<treeNode*> child;    //数组里存指向孩子节点指针-> 有多个孩子最多4个 具体不知道 动态数组有几个就加几个treeNode(){}~treeNode(){pos.row = 0;pos.col = 0;pParent = NULL;child.clear();}};
treeNode* createTreeNode(int row, int col);    //创建点
//判断pos点能不能走,传入两个地图和点 能走返回ture,不能返回false
bool canWalk(int map[ROWS][COLS], bool pathMap[ROWS][COLS], MyPoint pos);int main(){//地图int map[ROWS][COLS] = {{ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 },{ 0, 1, 1, 0, 1, 0, 1, 1, 1, 0 },{ 0, 0, 0, 0, 1, 0, 1, 1, 1, 0 },{ 0, 1, 1, 1, 1, 0, 1, 1, 1, 0 },{ 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 0 },{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }};//辅助地图bool pathMap[ROWS][COLS] = { 0 };          //都为0-> 都没有找过MyPoint begPos = { 0, 0 };//起点MyPoint endPos = { 0, 9 };//终点pathMap[begPos.row][begPos.col] = true;    //起点标记为走过treeNode* pRoot = NULL;//准备一棵树//起点成为树的根节点pRoot = createTreeNode(begPos.row, begPos.col);vector<treeNode*> buff;     //存储当前层-> 有当前层就有下一层 否则没办法从当前层转到下一层去buff.push_back(pRoot);      //当前层里是树的根节点-> 树的起点是当前层的第一个vector<treeNode*> nextBuff;   //存储下一层bool isFindEnd = false;treeNode* temp = NULL;while (1){nextBuff.clear();//清空下一层for (int i = 0; i < buff.size(); i++){//遍历当前层//找出 当前层的每一个buff[i] 所有相邻的能走的节点  存放到nextBuff中 并且 入树for (int j = 0; j < 4; j++){//判断能走还是不能走 每一个点只有4个方向-> 判断4个方向哪个能走哪个不能走temp = createTreeNode(buff[i]->pos.row, buff[i]->pos.col);    //创建新节点等于当前节点switch (j){case p_up:       temp->pos.row--; break;case p_down:  temp->pos.row++; break;case p_left:    temp->pos.col--; break;case p_right: temp->pos.col++; break;}if (canWalk(map, pathMap, temp->pos)){//为真能走 不为真不能走直接释放//标记走过pathMap[temp->pos.row][temp->pos.col] = true;//入树buff[i]->child.push_back(temp); //temp成为buff[i]的子temp->pParent = buff[i];       //buff[i]成为temp的父
#if 1if (endPos == temp->pos){       //找到了就结束-> 只结束了j循环isFindEnd = true;break;}
#endif//存入nextBuff中nextBuff.push_back(temp);}else{//不能走delete temp; //释放temp = NULL;}}// end of for(j)if (isFindEnd) break;//结束i循环    }// end of for(i)if (isFindEnd) break;    //结束while循环if (0 == nextBuff.size()) break;//地图都遍历完了-> 找不到下一个就结束buff = nextBuff;//切换到下一层去}//end of while(1)if (isFindEnd){cout << "找到终点啦!" << endl;while (temp){//输出路径cout << "("<<temp->pos.row << ","<< temp->pos.col << ") ";temp = temp->pParent;//temp要往上走}cout << endl;}while (1);return 0;
}treeNode* createTreeNode(int row, int col){treeNode* pNew = new treeNode;memset(pNew, 0, sizeof treeNode);    //清空pNew->pos.row = row;            pNew->pos.col = col;return pNew;
}
//判断pos点能不能走,能返回ture,不能返回false
bool canWalk(int map[ROWS][COLS], bool pathMap[ROWS][COLS], MyPoint pos){//越界-> 超出数组范围if (pos.row < 0 || pos.row >= ROWS || pos.col < 0 || pos.col >= COLS) return false;//是障碍物if (1 == map[pos.row][pos.col]) return false;//走过if (true == pathMap[pos.row][pos.col]) return false;return true;
}

寻路算法 --- 广度寻路算法相关推荐

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

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

  2. 广度寻路算法C++实现

    广度寻路算法C++实现 广度寻路和深度寻路算法是两种常用的图形搜索算法,当然这里的寻路,是指在一个二维平面上,我们将平面划分为许多个方格,给定目的地和起始地,寻找到一条起点到终点之间的路径.广度寻路算 ...

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

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

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

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

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

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

  6. 寻路的几种算法_Godot游戏开发实践之二:AI之寻路新方式

    一.前言 AI 一直是游戏开发中一个热门词汇,当然这不是人工智能的那个 AI ,而是指有着人类思想的 NPC 或者聪明的敌人等等.根据游戏的类型和复杂程度, AI 的实现可以很简单,也可以非常复杂.作 ...

  7. 【数据结构与算法】->算法-> A* 搜索算法->如何实现游戏中的寻路功能?

    A* 搜索算法 Ⅰ 前言 Ⅱ 算法解析 Ⅲ 如何实现游戏寻路问题 Ⅳ 总结 Ⅰ 前言 你可能玩过魔兽世界,仙剑奇侠和英雄联盟这类 MMRPG 游戏,在这些游戏中,有一个非常重要的功能,就是人物角色自动 ...

  8. NavMesh寻路中的漏斗算法

    转自:https://www.cnblogs.com/pointer-smq/p/11332897.html NavMesh是广泛使用的一种寻路技术,将地图中可走的部分生成连续的多边形/三角形网格,寻 ...

  9. 实用高效的寻路算法——A*寻路算法的实现及优化思路

    前言:寻路是游戏比较重要的一个组成部分.因为不仅AI还有很多地方(例如RTS游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能. 本文将介绍一个经常被使用且效率理想的寻路方 ...

最新文章

  1. Java存储过程调用CallableStatement
  2. python 命令-python解析命令行参数的三种方法详解
  3. 网络与IO知识扫盲(一):Linux虚拟文件系统,文件描述符,IO重定向
  4. 深度学习(3)手写数字识别问题
  5. Replace Parameter with Methods(以函数取代参数)
  6. 第六次程序设计作业 计算器图型界面的设计
  7. oracle数据库用户创建_权限分配_以及导入_导出数据,oracle数据库用户创建、权限分配,以及导入,导出数据...
  8. repo + gerrit
  9. python 堆栈溢出_IAR堆栈溢出的问题
  10. 卡尺测量的最小范围_车间里常用的测量器具,别说没见过!
  11. Mac otool替代readelf命令
  12. 谷歌眼镜设计规范之度量和网格
  13. 编写c#程序,修改文件后缀名
  14. 2011最全的国内外开源SNS源码大集合
  15. Microsoft.NET离线运行库合集
  16. Grafana Tempo简介
  17. 2020 Multi-University Training Contest 6
  18. java.util.Date中的loe_Java-学习日记(日期的转换与处理)
  19. 文件误删除怎么恢复?解忧小妙招
  20. 3.8女王节里的宝妈生意经

热门文章

  1. 安卓系统管理软件_【韩文餐饮多国语言收银系统韩语/朝鲜地区通用软件包邮】免费在线试用_软件库...
  2. 旅游网站竞品分析—携程旅行网VS去哪儿网(上)
  3. 数据库之文件管理--SimpleDB
  4. 微信小程序使用意见反馈
  5. 推荐一款注册表清理软件(含注册码)
  6. kaggle数据集汇总_Kaggle比赛快速上手演示
  7. 阿里二面,前端开发在web3.0中该如何应用,记录面经
  8. 基于FDTD的基本流程
  9. NetConf Brower使用
  10. selenium+brower爬虫准备