深度寻路算法

深度寻路算法思想

  • 规定试探方向顺序-顺时针(上右下左)和逆时针方向(上左下右)
  • 实时记录每个点 当前试探方向 记录每个点是否走过
  • 如果四个方向都不能走,则需要回退
  • 回退每走一步,栈结构存储当前位置
    注:需要回退时,删除当前栈顶元素,跳到当前栈顶元素处
  • 遇到终点,循环结束栈结构存储起点到终点的路径,栈为空

1:已知当前坐标(currentpos),我们设置一个试探点(searchpos),通过设定的方向(顺时针或逆时针)
2:判断试探点是否能走,如果能走就标记该坐标能走,入栈。
3:如果不能走,改变方向,循环如此,直至找到终点。
4:没有找到终点,但栈为空,整个辅助地图遍历完毕。


寻路代码

int map[ROWS][CLOS] ={1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1,1 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 1,1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 1,1 , 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 1,1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 1,1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1,1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1,1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1,1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 1,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1};pathNode pathmap[ROWS][CLOS] = { 0 }; //辅助地图//准备一个栈MyTack<point>  stack;point begPos = { 1,1 };  //起点point endPos = { 9, 8 }; //终点//起点准备入栈stack.push(begPos);//标记起点走过pathmap[begPos.row][begPos.clos].isFind = true;//当前点point currentpos = begPos;//试探点point searchPos;//是否找到了终点bool isFindEnd = false;while (1){//循环寻路searchPos = currentpos;switch (pathmap[currentpos.row][currentpos.clos].dir){case p_up:searchPos.row--;pathmap[currentpos.row][currentpos.clos].dir++;//判断能不能走if (map[searchPos.row][searchPos.clos] == 0 && pathmap[searchPos.row][searchPos.clos].isFind == false){pathmap[currentpos.row][currentpos.clos].dir++;//走currentpos = searchPos;//标记当前点走过pathmap[currentpos.row][currentpos.clos].isFind = true;//入栈stack.push(currentpos);}break;case p_right:searchPos.clos++;pathmap[currentpos.row][currentpos.clos].dir++;//判断能不能走if (map[searchPos.row][searchPos.clos] == 0 && pathmap[searchPos.row][searchPos.clos].isFind == false){pathmap[currentpos.row][currentpos.clos].dir++;//走currentpos = searchPos;//标记当前点走过pathmap[currentpos.row][currentpos.clos].isFind = true;//入栈stack.push(currentpos);}break;case p_down:searchPos.row++;pathmap[currentpos.row][currentpos.clos].dir++;//判断能不能走if (map[searchPos.row][searchPos.clos] == 0 && pathmap[searchPos.row][searchPos.clos].isFind == false){pathmap[currentpos.row][currentpos.clos].dir++;//走currentpos = searchPos;//标记当前点走过pathmap[currentpos.row][currentpos.clos].isFind = true;//入栈stack.push(currentpos);}break;case p_left:searchPos.clos--;pathmap[currentpos.row][currentpos.clos].dir++;//判断能不能走if (map[searchPos.row][searchPos.clos] == 0 && pathmap[searchPos.row][searchPos.clos].isFind == false){//走currentpos = searchPos;//标记当前点走过pathmap[currentpos.row][currentpos.clos].isFind = true;//入栈stack.push(currentpos);}else{//不能走 死胡同stack.pop(); //删除当前栈顶元素currentpos = stack.getTop();  //跳到栈顶元素}break;}Sleep(200);printMap(map, currentpos);//判断是否找到终点if (endPos == currentpos){isFindEnd = true;break;}//判断是否为空if (stack.isEmpty()){break;}}//找到了终点了if (isFindEnd){printf("找到终点了\n");while (stack.isEmpty()){printf("%d %d", stack.getTop().row, stack.getTop().clos);stack.pop();}printf("\n");}

创建一个栈

#pragma once
#include<stdlib.h>
#include<cstring>template <class T>
class MyTack
{T* buff;int len;int maxlen;
public:MyTack() { buff = NULL; len = 0; maxlen = 0; };~MyTack(){if (buff)delete[] buff;buff = NULL;len = 0;maxlen = 0;};//入栈void push(const T& data);//出栈void pop(){if (len > 0){len--;}}//获取当前栈顶元素T getTop(){return buff[len - 1];}//判断栈是否为空bool isEmpty(){return (len == 0);}
};template <class T>
void MyTack<T>::push(const T& data)
{//判断是否需要申请内存if (maxlen <= len){//计算需要申请的内存大小   >>1右移一位等同除以2maxlen = maxlen + (((maxlen >> 1) > 1) ? (maxlen >> 1) : 1);//开内存T* pNew = new T[maxlen];if (buff){memcpy(pNew, buff, sizeof(T) * len);//释放内存段delete[] buff;}//指向新开内存buff = pNew;buff[len++] = data;}
}

以上代码均不是完整版,本文章仅用此学习,如有问题请指正!

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

  1. Day8:寻路算法---深度寻路

    一.基础概念: 寻路算法 --- 深度寻路算法_https://blog.csdn.net/weixin_60569662/article/details/123651939 思路: 1. 规定试探方 ...

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

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

  3. android 绘制歌词算法,深度学习算法写歌词

    AI开发平台ModelArts ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注.大规模分布式Training.自动化模型生成,及端-边-云模型 ...

  4. c/c++数据结构之深度寻路算法基础(含自己写的源码)

    一.深度寻路算法原理 第一步,我们要规定好人物的试探方向 : 即上右下左,上左下右 什么意思呢?就是计算机中的人物要看看自己的四周是空地还是墙,如果是墙就不能走,是空地则可以走. 第二步. 我们要进行 ...

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

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

  6. C语言-老鼠走迷宫(深度寻路算法)

    老鼠走迷宫-c语言(基于深度优先的寻路算法) 这个是学校的课设,刚开始有点头疼,但是感觉越做越有意思了,于是就有如下代码,可能相较于大佬还有差距,但是这是我目前所能做的最优的程序了吧! 话不多说,说一 ...

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

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

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

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

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

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

最新文章

  1. 字符串作为freemarker模板的简单实现例子
  2. 【资源】分享1套最适合Py开发的机器学习/大数据视频课程
  3. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
  4. 郑州大学研究生院 郑州大学产业技术研究院
  5. Linux 设备驱动开发 —— Tasklets 机制浅析
  6. MIK C语言面试两题
  7. 读《DTS分析模型、设计模型》有感
  8. 有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
  9. python从入门到精通pdf-跟老齐学Python:从入门到精通 完整版PDF[7MB]
  10. scala学习(一)
  11. Java设计模式——代理模式实现及原理
  12. Java惯性数据库_来自ThreeJS的OrbitControl中的惯性
  13. 失业一年,学做跨境电商赚了50万,才知道上班是真的耽误赚钱 !
  14. mongo java 注解,在Java中使用Spring Data MongoDB操作Mong | zifangsky的个人博客
  15. 十年电影票房数据爬取与分析 | 免费数据教程
  16. 推荐2022年有微信小程序毕业设计需求的70多个作品
  17. Python制作桑基图
  18. 在WORD表格中如何实现加法?
  19. Vertx中的verticle详解
  20. 【人工智能】作业1: Bait游戏 实验报告

热门文章

  1. OSChina 周三乱弹 —— 平胸就没个优点么
  2. 大数据测试之大数据系统及特点
  3. python如何并发上千个get_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘...
  4. 【AI创造营】AI染发,拒绝选择。
  5. 【转】偷了世界的程序员(真正让我们成为局域网的不是那个墙,而是我们自己的肤浅) ...
  6. 以开放与融合为杀手锏:天翼空间与天翼宽带
  7. 2022年运动蓝牙耳机推荐、运动蓝牙耳机质量排行榜
  8. 关于linux下的嵌入式文件系统以及flash文件系统选择
  9. Thymeleaf---基础知识
  10. 爱心跳动效果 CSS实现