返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ DFS算法如何实现走迷宫自动寻路
  • 136
分享到

C++ DFS算法如何实现走迷宫自动寻路

2023-06-15 02:06:04 136人浏览 薄情痞子
摘要

小编给大家分享一下c++ DFS算法如何实现走迷宫自动寻路,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容

小编给大家分享一下c++ DFS算法如何实现走迷宫自动寻路,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容如下

深度优先搜索百度百科解释:

事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.

运行效果:

C++ DFS算法如何实现走迷宫自动寻路

C++ DFS算法如何实现走迷宫自动寻路

说明:

深度优先搜索算法是在我在图的部分接触到的,后来才发现它也可以不用在图的遍历上,它是一个独立的算法,它也可以直接用在一个二维数组上。

其算法原理和实现步骤在代码中已经有了很好的体现了,这里就不再赘述。

在程序中实现了手动操控走迷宫和自动走迷宫两种模式,并且可在自动走完迷宫后显示行走的路径。

如果要修改程序使用的迷宫地图只需要修改map二维地图数组和两个地图宽高的常量值即可。同样可以使用自动走迷宫的模式。

理论上这种算法可以对任意大小任意复杂的迷宫搜索路径,但是因为这种算法是用递归实现的,占用空间较大,地图大小增大也会多使用很多的空间,受限于堆栈空间的限制我在把地图大小增加到2020的时候运行自动寻路模式就会报堆栈溢出异常了。我在代码准备了1818和15*15的两个迷宫地图二维数组用于测试

编译环境:

windows VS2019

代码:

Game.h 游戏类

#pragma once#include <iOStream>#include <map>#include <coNIO.h>#include <vector>#include <windows.h>using namespace std;//地图宽高常量constexpr unsigned int mapWidth = 18;constexpr unsigned int mapHeight = 18;//游戏类class Game{private: map<int, string> cCMAEMap;  //地图数组元素对应字符 map<char, int*> movDistanceMap; //按键对应移动距离 int px, py;      //玩家坐标 int dArr[4][2] = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };  //数值和移动方向对应数组 vector<int*> tempPathVec;  //路径向量 vector<vector<int*>> allPathVec;//存储所有路径向量 //检查参数位置是否可走 bool check(int x, int y, int(*map)[mapWidth]) {  //判断修改后的玩家坐标是否越界、修改后的玩家坐标位置是否可走  if (x < 0 || x >= mapWidth || y < 0 || y >= mapHeight || (map[y][x] != 0 && map[y][x] != 3))   return false;  return true; } //控制玩家移动函数 bool controlMove (int(*map)[mapWidth]) {  //键盘按下时  if (!_kbhit()) return false;     char key = _getch();  if (key != 'w' && key != 's' && key != 'a' && key != 'd')   return false;  int temp_x = px, temp_y = py;  //临时记录没有改变之前的玩家坐标  px += movDistanceMap[key][0];  py += movDistanceMap[key][1];  //如果位置不可走则撤销移动并结束函数  if (!check(px, py, map))  {   px = temp_x, py = temp_y;   return false;  }  //判断是否已到达终点  if (map[py][px] == 3)  {   //打印信息并返回true   cout << "胜利!" << endl;   return true;  }  map[temp_y][temp_x] = 0;   //玩家原本的位置重设为0路面  map[py][px] = 2;     //玩家移动后的位置设为玩家2  //清屏并打印修改后地图  system("cls");  printMap(map);   return false; } //用对应图形打印地图 void printMap(int(*map)[mapWidth]) {  for (int i = 0; i < mapHeight; i++)  {   for (int j = 0; j < mapWidth; j++)    cout << cCMAEMap[map[i][j]];   cout << endl;  } } //初始化map容器 void initMapContainer() {  //数组元素和字符对应  string cArr[4] = { "  ", "■", "♀", "★" };  for (int i = 0; i < 4; i++)   cCMAEMap.insert(pair <int, string>(i, cArr[i]));  //输入字符和移动距离对应  char kArr[4] = { 'w', 's', 'a', 'd' };  for (int i = 0; i < 4; i++)   movDistanceMap.insert(pair <char, int*>(kArr[i], dArr[i])); } //找到玩家所在地图的位置 void findPlayerPos(const int(*map)[mapWidth]) {  for (int i = 0; i < mapHeight; i++)   for (int j = 0; j < mapWidth; j++)    if (map[i][j] == 2)     {     px = j, py = i;     return;    } } //深度优先搜索 void dfs(int cx, int cy, int(*map)[mapWidth]) {  //把当前玩家位置插入到数组  tempPathVec.push_back(new int[2] {cx, cy});  //循环四个方向上下左右  for (int i = 0; i < 4; i++)  {   int x = cx + dArr[i][0]; //玩家下一个位置的坐标   int y = cy + dArr[i][1];   //检查下一个位置是否可走   if (!check(x, y, map))     continue;   if (map[y][x] == 3) //已到达终点   {    tempPathVec.push_back(new int[2]{ x, y }); //把终点位置插入到向量中    allPathVec.push_back(tempPathVec);    return;   }   //为普通路径   else   {    map[cy][cx] = -1;  //当前位置临时设为-1,递归搜索时不可走原路,非0且非3的位置都不可走    dfs(x, y, map);   //用下一个位置作为参数递归    map[cy][cx] = 0;  //递归完成后将当前位置重设为0,可走路径   }  }  //最后没有找到可走的路径则删除向量最后一个元素,此时函数结束递归退回到上一层  tempPathVec.pop_back(); } //输出路径信息 void printPathInfORMation() {  //int minSizePathIndex = 0;  //记录最短路径在路径向量中的下标  //for (int i = 0; i < allPathVec.size(); i++)  //{  // cout << allPathVec.at(i).size() << "  ";  // if (allPathVec.at(i).size() < allPathVec.at(minSizePathIndex).size())  //  minSizePathIndex = i;  //}  //cout << endl << "最小长度:" << allPathVec.at(minSizePathIndex).size() << endl;  输出最短路径信息  //for (auto dArr2 : allPathVec.at(minSizePathIndex))  // cout << dArr2[0] << "_" << dArr2[1] << "  ";  //输出所有路径信息  //for (auto arr : allPathVec)  //{  // for (auto dArr2 : arr)  //  cout << dArr2[0] << "__" << dArr2[1] << "  ";  // cout << endl;  //} } //寻找路径 int findPath(int(*map)[mapWidth]) {  findPlayerPos(map);    //找到玩家所在地图中的位置  //如果多次调用findPaths函数,则需要先清除上一次调用时在向量中遗留下来的数据  tempPathVec.clear();  allPathVec.clear();  dfs(px, py, map);    //找到所有路径插入到allPathVec  //找到最短路径在allPathVec中的下标  int minSizePathIndex = 0;  //记录最短路径在路径向量中的下标  for (int i = 0; i < allPathVec.size(); i++)  {   if (allPathVec.at(i).size() < allPathVec.at(minSizePathIndex).size())    minSizePathIndex = i;  }  return minSizePathIndex; } //显示路径 void showPath(int(*map)[mapWidth], vector<int*> tempPathVec) {  //将能找到的最短的路径上的元素赋值全部赋值为2并输出  for (auto tempDArr : tempPathVec)   map[tempDArr[1]][tempDArr[0]] = 2;  system("cls");  printMap(map);   //打印地图 } //手动模式 void manualMode(int(*map)[mapWidth]) {  while (!controlMove(map)) //游戏循环   Sleep(10); } //自动模式 void automaticMode(int(*map)[mapWidth]) {  //找到最短路径  vector<int*> tempPathVec = allPathVec.at(findPath(map));  for (int i = 1; i < tempPathVec.size(); i++)  {   map[tempPathVec[i - 1][1]][tempPathVec[i - 1][0]] = 0;   map[tempPathVec[i][1]][tempPathVec[i][0]] = 2;   system("cls");   printMap(map);  //打印地图   Sleep(200);  }  cout << "胜利!是否打印完整路径?(Y / N)" << endl;  char key = _getch();  if(key == 'Y' || key == 'y')   showPath(map, tempPathVec); }public:  //构造 Game(int(*map)[mapWidth], char mode) {  initMapContainer();  //初始化map容器  findPlayerPos(map);  //找到玩家所在地图中的位置    system("cls");  printMap(map);   //先打印一遍地图 ♀ ■ ★  (mode == '1') ? manualMode(map) : automaticMode(map); } //析构释放内存 ~Game() {  for (auto it = tempPathVec.begin(); it != tempPathVec.end(); it++)  {   delete* it;   *it = nullptr;  }  tempPathVec.clear();  //这里不会释放allPathVec了  allPathVec.clear(); }};

迷宫.cpp main函数文件

#include "Game.h"//光标隐藏void HideCursor(){ CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}int main(){ HideCursor();  //光标隐藏 //0空地,1墙,2人, 3出口 //int map[mapHeight][mapWidth] = { // 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, // 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, // 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, // 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, // 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, // 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, // 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, // 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, // 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, // 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, // 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, // 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, // 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, // 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 3, //}; int map[mapHeight][mapWidth] {  2, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1,  0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1,  1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0,  1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0,  1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1,  0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1,  0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1,  0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0,  0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1,  1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0,  0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1,  1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,  1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0,  0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1,  0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,  1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0,  1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 3, }; //复制一个一样的数组以保证重新开始游戏时可以重置数组 int mapCopy[mapHeight][mapWidth]; memcpy(mapCopy, map, sizeof(mapCopy));  while (true) {  cout << "选择模式:1,手动   2,自动" << endl;  char key = _getch();  Game game(mapCopy, key);  //进入游戏  cout << "输入r重新开始:" << endl;  key = _getch();  if (key != 'r' && key != 'R') //输入值不为r则结束程序   break;    memcpy(mapCopy, map, sizeof(mapCopy));  //重新赋值  system("cls"); }  return 0;}

以上是“C++ DFS算法如何实现走迷宫自动寻路”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C++ DFS算法如何实现走迷宫自动寻路

本文链接: https://lsjlt.com/news/277043.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++ DFS算法实现走迷宫自动寻路
    C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容如下 深度优先搜索百度百科解释: 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Searc...
    99+
    2024-04-02
  • C++ DFS算法如何实现走迷宫自动寻路
    小编给大家分享一下C++ DFS算法如何实现走迷宫自动寻路,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容...
    99+
    2023-06-15
  • C++ 基于BFS算法的走迷宫自动寻路的实现
    目录1.效果图2.实现代码1.队列方法类2.地图方法类3.main函数3.思路1.效果图 其中正方形代表障碍物,实心菱形代表移动者(人),空心菱形代表目标位置(都是可以在代码中修改...
    99+
    2024-04-02
  • Python实现迷宫自动寻路实例
    目录背景预处理寻路算法测试优化绘制路径结语背景 我打开手机,发现有人在QQ空间里叫嚣。 看他得意的样子,显然是在家里呆久了,已经忘了天有多高。 预处理 设计一个迷宫自动寻路算法并不...
    99+
    2024-04-02
  • Python实现随机生成迷宫并自动寻路
    目录Python深搜版:Python 广搜版lua版:Python深搜版: 核心在于带随机的深搜(见代码第23到27行,其实也可以用22行代替这几行代码,你可以试着把第24行的数字4改大或者改小,即调整随机程度) ...
    99+
    2022-06-02
    Python随机生成迷宫 Python 迷宫自动寻路
  • Javascript结合Vue实现对任意迷宫图片的自动寻路
    目录前言二维数组,一本道映射基础界面广度优先,地毯式搜索地图编辑优化寻路算法对图片进行寻路自定义起始点,以及随时变更路线处理彩色图片性能优化前言 可以直接体验最终效果:https:/...
    99+
    2024-04-02
  • 如何利用JAVA实现走迷宫程序
    本Demo使用三个类 一个Test类 一个自定义的Stack类 一个自定义的Queue类 可以实现的功能: 1.对于一个写在文本文件中的迷宫,能够将其转换为二维数组用广度优先搜索实现...
    99+
    2024-04-02
  • 如何用C++实现A*寻路算法
    目录一、A*算法介绍二、A*算法步骤解析三、A*算法优化思路3.1、openList使用优先队列(二叉堆)3.2、障碍物列表,closeList 使用二维表(二维数组)3.3、深度限...
    99+
    2024-04-02
  • 如何使用Python实现多路径迷宫
    小编给大家分享一下如何使用Python实现多路径迷宫,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的数据类型有哪些python的数据类型:1. 数字类...
    99+
    2023-06-14
  • C#中Astar寻路算法怎么实现
    以下是一种基本的A*寻路算法的实现示例,可以用于C#语言:```csharpusing System;using System.Co...
    99+
    2023-09-22
    C#
  • Java算法之BFS,DFS,动态规划和贪心算法如何实现
    本篇内容主要讲解“Java算法之BFS,DFS,动态规划和贪心算法如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java算法之BFS,DFS,动态规划和贪心算法如何实现”吧!广度优先搜索...
    99+
    2023-07-05
  • unity如何实现自带寻路导航系统
    小编给大家分享一下unity如何实现自带寻路导航系统,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、介绍unity官方文档:导航网格(即 Navigation ...
    99+
    2023-06-25
  • C++最短路径Dijkstra算法如何实现
    这篇文章主要介绍“C++最短路径Dijkstra算法如何实现”,在日常操作中,相信很多人在C++最短路径Dijkstra算法如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++最短路径Dijkstra...
    99+
    2023-07-05
  • 如何用html5和css3实现小机器人走路动画
    本篇内容介绍了“如何用html5和css3实现小机器人走路动画”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • 【路径规划】局部路径规划算法——DWA算法(动态窗口法)|(含python实现 | c++实现)
    文章目录 参考资料1. DWA算法原理1.1 简介1.2 算法原理1. 速度采样2. 轨迹预测(轨迹推算)3. 轨迹评价 2. Python实现2.1 参数配置2.2 机器人运动学模...
    99+
    2023-08-31
    python 机器人 路径规划 DWA 动态窗口法
  • 如何使用html5和css3实现的小机器人走路动画
    这篇文章主要介绍如何使用html5和css3实现的小机器人走路动画,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!    html5代码如下:  ...
    99+
    2024-04-02
  • c# 如何实现自动更新程序
    目录主要功能介绍客户端main方法入口主窗体代码更新帮助类版本xml文件解析服务端版本xml文件自动升级服务Controller版本文件自动生成帮助类结语主要功能介绍 实现文件的自动...
    99+
    2024-04-02
  • 如何实现前端表格自动计算
    这篇文章将为大家详细讲解有关如何实现前端表格自动计算,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。序言当我的团队进行税务系统模块开发的时候,我发现他们需要花费80%的时间去解决计算问题,尤其体现在表格(G...
    99+
    2023-06-08
  • C#如何实现银行家算法
    这篇文章给大家分享的是有关C#如何实现银行家算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.死锁死锁,顾名思义,是一种锁住不可自行解开的死局。在操作系统中,“死锁”用于描述资源分配时,进程互相抢占资源,又因...
    99+
    2023-06-15
  • C#如何实现抢红包算法
    今天小编给大家分享一下C#如何实现抢红包算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。二倍均值法(公平版) 发...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作