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

本文介绍了如何使用C++的深度优先搜索(DFS)算法解决走迷宫问题。DFS不仅适用于图的遍历,也可直接应用于二维数组上的迷宫。程序包含了手动和自动走迷宫两种模式,能展示行走路径。通过修改二维数组和地图尺寸常量,可适应不同迷宫。由于递归实现,当迷宫规模扩大可能导致堆栈溢出。代码在VS2019环境下编译,提供了1818和15*15两种迷宫地图的示例。
摘要由CSDN通过智能技术生成
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]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值