C++ DFS算法实现走迷宫自动寻路
深度优先搜索百度百科解释:
事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
运行效果:
说明:
深度优先搜索算法是在我在图的部分接触到的,后来才发现它也可以不用在图的遍历上,它是一个独立的算法,它也可以直接用在一个二维数组上。
其算法原理和实现步骤在代码中已经有了很好的体现了,这里就不再赘述。
在程序中实现了手动操控走迷宫和自动走迷宫两种模式,并且可在自动走完迷宫后显示行走的路径。
如果要修改程序使用的迷宫地图只需要修改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]