一、基础概念:

寻路算法 --- 深度寻路算法_https://blog.csdn.net/weixin_60569662/article/details/123651939

思路:

1. 规定试探方向顺序
            顺时针(上 右 下 左)     逆时针(上 左 下 右)
        2. 实时记录每个点  当前试探方向
            实时记录每个点 是否走过
        3. 回退
            每走一步,栈结构存储当前位置
            需要回退的时候:
                删除当前栈顶元素
                跳到当前栈顶元素处
        4. 遇到终点  
            循环结束   栈结构存储起点到终点的路径
            整个地图都找不到终点   栈为空

二、代码实现

1.数据结构----栈的准备

#pragma once
#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;template <class T>
class MyStack
{
public:MyStack(){pBuffer = nullptr;len = maxLen = 0;}~MyStack(){if (pBuffer)delete[]pBuffer;pBuffer = nullptr; len = maxLen = 0;}void pop() { if(len>0)len--; }T GetTop() { return pBuffer[len - 1]; }bool isEmpty() { return (len == 0); }void push(const T& data);
private:T* pBuffer;int len;int maxLen;
};template<class T>
inline void MyStack<T>::push(const T& data)
{if (len >= maxLen)//此时需要另外开内存{maxLen +=(((maxLen >> 1>1)) ? maxLen >> 1 : 1);//若整除之后为0,至少得增加一个T* pNew = new T[maxLen];if (pBuffer)//之前存在的话,才需要进行memcpy{memcpy(pNew, pBuffer, len * sizeof(T));delete []pBuffer;}pBuffer = pNew;}pBuffer[len++] = data;//_ASSERTE(_CrtCheckMemory());
}

又遇到上次的bug了--->直接放上次写博客链接了。【BUG----优先级】7.9 被?:问号冒号表达式的优先级坑了https://blog.csdn.net/zjjaibc/article/details/125694367?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22125694367%22%2C%22source%22%3A%22zjjaibc%22%7D&ctrtid=1RMiZ

2.准备工作:

辅助地图(是否走过、当前点的探索方向)、正式地图、描述坐标的类

注:最好用0来初始化->0来代表第一个方向up&&用0来是否走过(一键初始化)

#include"MyStack.h"
#include<graphics.h>
#include<Windows.h>#define ROWS 10
#define COLS 10enum dir
{UP, LEFT, DOWN, RIGHT
};//默认值为0,1,2,3//辅助地图
struct pathNode
{int dir;//当前的探索方向bool isArrive;//是否走过了  0表示没走过
};
//人物or探索位置的坐标
struct pos
{int row;int col;bool operator==(const struct pos b){return (row == b.row) && (col == b.col);}
};
int MAP[ROWS][COLS] =
{{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 0, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 1, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 1, 1, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }};//0表示road
struct pos beg_xy = { 1,1 };//起点
struct pos pos_xy = { 8,7 };//终点struct pathNode pathmap[ROWS][COLS] = { 0 };//一键重置新地图(0->up&&没走过)IMAGE people, road, wall, pos,beg,ball;#define WIDTH 80  //单个贴图的大小
void drawmap(int MAP[ROWS][COLS],struct pos pep, struct pos beg, struct pos end);
void init();
void init()
{//1.创建窗口initgraph(COLS * WIDTH, ROWS * WIDTH, SHOWCONSOLE);//2.加载绑定图片(注意字符集兼容问题)loadimage(&people,"res/people.bmp", WIDTH, WIDTH, true);loadimage(&wall, "res/wall.bmp", WIDTH, WIDTH, true);loadimage(&road, "res/road.bmp", WIDTH, WIDTH, true);loadimage(&pos, "res/pos.bmp", WIDTH, WIDTH, true);loadimage(&beg, "res/beg.bmp", WIDTH, WIDTH, true);loadimage(&ball, "res/ball.bmp", WIDTH/2, WIDTH/2, true);
}void drawmap(int MAP[ROWS][COLS],struct pos pep,struct pos begin,struct pos end)
{for (int i = 0; i < COLS; i++){for (int j = 0; j < ROWS; j++){if (pep.row == i && pep.col == j)putimage(j * WIDTH, i * WIDTH, &people);else if (begin.row == i && begin.col == j)putimage(j * WIDTH, i * WIDTH, &beg);else if (end.row == i && end.col == j)putimage(j * WIDTH, i * WIDTH, &pos);else if (MAP[i][j] == 1)putimage(j * WIDTH, i * WIDTH, &wall);else if (MAP[i][j] == 0)putimage(j * WIDTH, i * WIDTH, &road);}}
}

3.核心逻辑(栈的回退->探索到最后一个方向right开始判断)

1.已知当前点的坐标,找试探点-> 在辅助地图中记录了当前点的当前试探方向

2.判断试探点是否能走, 如果能走,走的时候标记点已经走过了,要入栈 如果不能走:

2.1.(前面三个方向中某一个能走)试探方向改变

2.2.(第四个方向还是不能走) 回退,删除栈顶元素,跳到当前栈顶元素处即可

3.判断是否结束循环

3.1找到终点了

3.2没有找到终点,但是栈空了-> 整个地图都找遍了


int main()
{init();struct pos people_xy=beg_xy;struct pos search_xy;MyStack<struct pos>trait;//存放路径trait.push(beg_xy);//起点入栈pathmap[beg_xy.row][beg_xy.col].isArrive = true;//起点标记走过bool isFind = false;while (!isFind){search_xy = people_xy;//每次循环之前,都要重置searchNode的位置//cout << pathmap[people_xy.row][people_xy.col].dir << endl;switch (pathmap[people_xy.row][people_xy.col].dir){case UP:pathmap[people_xy.row][people_xy.col].dir++;//先改变当前点的dir!!!便于下次寻路search_xy.row--;if (MAP[search_xy.row][search_xy.col] == 0 &&//是路road 0pathmap[search_xy.row][search_xy.col].isArrive == 0)//且没走过{people_xy = search_xy;//走一步pathmap[search_xy.row][search_xy.col].isArrive = true;//标记走过!!trait.push(people_xy);//入栈}break;case LEFT:pathmap[people_xy.row][people_xy.col].dir++;//先改变当前点的dir!!!便于下次寻路search_xy.col--;if (MAP[search_xy.row][search_xy.col] == 0 &&//是路road 0pathmap[search_xy.row][search_xy.col].isArrive == 0)//且没走过{people_xy = search_xy;//走一步pathmap[search_xy.row][search_xy.col].isArrive = true;trait.push(people_xy);//入栈}break;case DOWN:pathmap[people_xy.row][people_xy.col].dir++;//先改变当前点的dir!!!便于下次寻路search_xy.row++;if (MAP[search_xy.row][search_xy.col] == 0 &&//是路road 0pathmap[search_xy.row][search_xy.col].isArrive == 0)//且没走过{people_xy = search_xy;//走一步pathmap[search_xy.row][search_xy.col].isArrive = true;trait.push(people_xy);//入栈}break;case RIGHT://pathmap[people_xy.row][people_xy.col].dir++;//先改变当前点的dir!!!便于下次寻路search_xy.col++;if (MAP[search_xy.row][search_xy.col] == 0 &&//是路road 0pathmap[search_xy.row][search_xy.col].isArrive == 0)//且没走过{people_xy = search_xy;//走一步pathmap[search_xy.row][search_xy.col].isArrive = true;trait.push(people_xy);//入栈break;}//如果到这了,还没有break,那么说明此点不能走->需要回退trait.pop();people_xy = trait.GetTop();//别忘记改人物位置}Sleep(20);drawmap(MAP, people_xy, beg_xy, pos_xy);if (pos_xy == people_xy)isFind = true;if (trait.isEmpty())break;}//在栈上开辟的空间记得释放if (isFind){cout << "找到了!" << endl;while (!trait.isEmpty()){cout << '[' << trait.GetTop().row << ',' << trait.GetTop().col << ']';putimage(trait.GetTop().col * WIDTH + WIDTH / 4, trait.GetTop().row * WIDTH + WIDTH / 4, &ball);trait.pop();}}while (1);return 0;
}

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

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

    深度寻路算法 深度寻路算法思想 规定试探方向顺序-顺时针(上右下左)和逆时针方向(上左下右) 实时记录每个点 当前试探方向 记录每个点是否走过 如果四个方向都不能走,则需要回退 回退每走一步,栈结构存 ...

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

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

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

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

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

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

  5. java 寻路算法_寻路算法-贪婪最佳优先算法

    最近开始接触寻路算法,对此不太了解的话建议读者先看这篇文章 <如何快速找到最优路线?深入理解游戏中寻路算法> . 所有寻路算法都需要一种方法以数学的方式估算某个节点是否应该被选择.大多数游 ...

  6. 寻路算法--迷宫寻路

    该篇文章接上篇并查集应用--生成随机迷宫, 此时已经可以生成一个任意大小随机的迷宫        但是看起来还缺点什么,对,就是路径,没有路径怎么证明这真的是个迷宫,因此现学现用把路径加上.首先寻路算 ...

  7. [转]关于寻路算法的一些思考

    关于寻路算法的一些思考(1):A*算法介绍 物体的移动算法似乎显得很简单,然而寻路规划问题却十分复杂.考虑下面这个例子: 这个单位的初始位置在地图的下方,想要到达地图的顶部.如果物体所能侦测到的地方( ...

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

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

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

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

最新文章

  1. DFS template and summary
  2. 腾讯离职,迪士尼给发了offer
  3. 南通一酒店搞了个“虎景房”,这睡得着?
  4. 对三层架构的简单改进
  5. 20应用统计考研复试要点(part41)--概率论与数理统计
  6. linux mongodb 升级,MongoDB2.6简单快速升级到3.0
  7. Linux操作系统中的文件管理技巧
  8. 深度学习的1000+篇文章总结
  9. 安装VMware时勾选增强型键盘驱动程序有什么用?
  10. 【转】常用0x000000类型颜色代码表
  11. 7层计算机网络体系结构,【计算机网络7层体系结构】
  12. 2013菏泽国际牡丹文化旅游节
  13. php判断合数,素数(质数)、合数计算器
  14. 实时数据缓存管理的初步设计
  15. 微信小程序:蓝牙通讯,搜索、发送与接收
  16. AndroidStudio入门基础(一)——基础布局
  17. 【Python爬虫案例学习4】Python 爬取meizitu
  18. MySQL数据完整性约束
  19. Android-动态修改APP桌面图标
  20. 海康视频H5插件 v2.0.0开发总结

热门文章

  1. vivado IP核:ILA、时钟、RAM、FIFO
  2. 京东店铺的所有商品API接口(item_search_shop-获得店铺的所有商品API接口),整店商品API接口
  3. java老年人健康预警系统系统uniapp小程序
  4. 计算机硬件技术基础---汇总
  5. php-ml 逻辑回归,TensorFlow ML cookbook 第三章6-8节 套索和岭回归、弹性网络回归and Logistic回归...
  6. 科学减肥(这样吃才有效)
  7. linux运维面试题:第一部分
  8. 如何使用活字格搭建报表数据中心系统?
  9. C++ RGB图片对比度调整
  10. java 反射getmethod_Java 反射机制中 getMethod()和getDeclaredField()区别