深度优先搜索实现走迷宫问题(c++实现)

这是数据结构老师的一道例题,具体的话:先生成一个15*15的矩阵,起点在矩阵的左上角,终点在矩阵的右下角,问是否能走出迷宫,如果可以的话,输出迷宫路径。

代码实现:

#include"pch.h"
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<cstdio>
using namespace std;

//生成迷宫
const int HEIGHT = 15;
const int WIDTH = 15;
int maze[HEIGHT][WIDTH];
void initialMaze()
{
	maze[0][0] = 0;//入口
	maze[HEIGHT - 1][WIDTH - 1] = 0;//出口
	for (int i = 0; i < HEIGHT; i++)//用随机数0,1填充迷宫
	{
		for (int j = 0; j < WIDTH; j++)
		{
			if (i == 0 && j == 0)
				continue;
			if (i == HEIGHT - 1 && j == WIDTH - 1)
				continue;
			maze[i][j] = rand() % 2;
		}
	}
	//展示生成的迷宫
	for (int i = 0; i < HEIGHT; i++)
	{
		for (int j = 0; j < WIDTH; j++)
		{
			cout << maze[i][j];
			if (j != WIDTH - 1)
			{
				cout << " ";
			}
			else
			{
				cout << endl;
			}
		}
	}
}
//生成方向
int directory[8][2] = { {0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
//判断是否越界
bool isLeap(int x, int y)
{
	return x >= 0 && x < WIDTH&&y >= 0 && y < HEIGHT;

}
//任意位置的结构体
struct point {
	int x;
	int y;
};
//声明用于存储路径的结构体
struct dir
{
	int x;
	int y;
	int d;
};
//声明用于存储路径的栈
stack<dir> directoryStack;
//迷宫循迹
void mazeTravel(point start, point end, int maze[HEIGHT][WIDTH], int directory[8][2])
{
	stack<dir> s;
	dir element, e;
	int i;
	int j;
	int d;
	int a;
	int b;
	maze[start.x][start.y] = 2;//首先在起点做上标记
	element.x = start.x;//第一个方向
	element.y = start.y;
	element.d = -1;
	directoryStack.push(element);
	while (!directoryStack.empty())//当栈不空,有路径可走时
	{
		element = directoryStack.top();
		directoryStack.pop();
		i = element.x;
		j = element.y;
		d = element.d + 1;
		while (d < 8)
		{
			a = i + directory[d][0];//预计的下一个点的位置
			b = j + directory[d][1];
			if (a == end.x&&b == end.y&&maze[a][b] == 0)//当我们找到了出口
			{
				element.x = i;//将原有元素入栈
			
	element.y = j;
				element.d = d;//更改了原有元素的方向指向
				directoryStack.push(element);
				element.x = a;
				element.y = b;
				element.d = 886;
				directoryStack.push(element);//将出口的信息入栈
				printf_s("\n0=东 1=东南 2=南 3=西南 4=西 5=西北 6=北 7=东北 886为则走出迷宫\n\n通路为:(行坐标,列坐标,方向)\n");
				while (!directoryStack.empty())//逆转序列输出迷宫路径序列
				{
					dir temp = directoryStack.top();
					directoryStack.pop();
					s.push(temp);
				}
				while (!s.empty())
				{
					dir temp = s.top();
					s.pop();
					printf_s("-->(%d,%d,%d)", temp.x, temp.y, temp.d);
				}
				return;
			}
			if (isLeap(a, b))
			{
				if (maze[a][b] == 0)
				{
					maze[a][b] = 2;
					element.x = i;
					element.y = j;
					element.d = d;
					directoryStack.push(element);
					i = a;
					j = b;
					d = -1;
				}
			}
			d++;
		}
	}
	printf_s("没有找到可以走出此迷宫的路径\n");
}
int main()
{
	srand(time(0));
	initialMaze();
	point a, b;
	a.x = 0;
	a.y = 0;
	b.x = HEIGHT - 1;
	b.y = WIDTH - 1;
	mazeTravel(a, b, maze, directory);
	return 0;
}

结果展示:

猜你喜欢

转载自blog.csdn.net/weixin_41106545/article/details/83115566