迷宫°是我们小的时候经常玩的游戏,可能我们小的时候对这个游戏比较好奇,大多数并没有在意其中存在的一些原理。本文讲述的是基于深度优先的随机迷宫生成算法(C语言版),相信对大家能够有所帮助。
首先,迷宫算法有三种,分为深度优先算法、prim算法和递归分割算法。我们这里讨论的是深度优先算法。
经过实验,我们发现该随机迷宫生成算法在处理大型迷宫时存在一定的性能问题。具体来说,当迷宫的大小增加时,算法的运行时间和空间复杂度均呈现出线性增长的趋势,时间复杂度为n^2。这主要是由于算法在搜索过程中需要遍历大量的节点和边。
在对比深度优先搜索和广度优先搜索两种搜索策略后,我们发现深度优先搜索在处理大型迷宫时具有更好的性能表现。这主要是因为深度优先搜索在搜索过程中可以提前结束对无意义路径的探索,从而节省了计算资源。而广度优先搜索在搜索过程中需要探索所有相邻节点,因此在处理大型迷宫时可能会浪费大量的计算资源。
#include<stdio.h>
#include<Windows.h>
#include<time.h>
#include<math.h>
//地图长度L,包括迷宫主体40,外侧的包围的墙体1+1,最外侧包围路径1+1
#define L 44
//墙和路径的标识
#define WALL 0
#define ROUTE 1
//控制迷宫的复杂度,数值越大复杂度越低,最小值为0
static int Rank = 0;
//生成迷宫
void CreateMaze(int **maze, int x, int y);
int main(void) {
int start=clock();//时间的起点
srand((unsigned)time(NULL));//srand函数是随机数发生器的初始化函数。
int **Maze = (int**)malloc(L * sizeof(int *));//语句给指针变量分配一个整型存储空间
for (int i = 0; i < L; i++) {
Maze[i] = (int*)calloc(L, sizeof(int));/*int* ptr = (int* )malloc(3*sizeof(int))用malloc开一块内存来存储长度为3的数组,
prt指向数组的第一个元素的地址。那么可以直接使用ptrli]来对数组元素赋值,
例如ptr[0]=1,ptr[1]=2, ptr[2]=3.
calloc函数也是与free()函数配套使用的,使用方式与malloc几乎相同,
也是在堆区申请动态内存空间。。*/
//calloc与malloc的区别
//1.参数的使用方式不同
//2.calloc会在返回起始地址之前,把在堆区申请的动态内存空间的每个字节都初始化为0
//注意要释放calloc申请的那块空间
}
//最外围层设为路径的原因,为了防止挖路时挖出边界,同时为了保护迷宫主体外的一圈墙体被挖穿
for (int i = 0; i < L; i++){
Maze[i][0] = ROUTE;//第一列
Maze[0][i] = ROUTE;//第一行
Maze[i][L - 1] = ROUTE;//最后一列
Maze[L - 1][i] = ROUTE;//最后一行
}
//创造迷宫,(2,2)为起点
CreateMaze(Maze, 2, 2);
//画迷宫的入口和出口
Maze[2][1] = ROUTE;
//由于算法随机性,出口有一定概率不在(L-3,L-2)处,此时需要寻找出口
for (int i = L - 3; i >= 0; i--) {
if (Maze[i][L - 3] == ROUTE) {//右下角位置 开始向上移动查找
Maze[i][L - 2] = ROUTE;// 将右侧打穿为出口
break;
}
}
//画迷宫
for (int i = 0; i < L; i++) {
for (int j = 0; j < L; j++) {
if (Maze[i][j] == ROUTE) {
printf(" ");
}
else {
printf("口");
}
}
printf("\n");
}
//释放calloc申请的那块空间
for (int i = 0; i < L; i++) free(Maze[i]);
free(Maze);
system("pause");//窗口有时会一闪就消失,如果不想消失,需添加
int end=clock();
int t=end-start;
printf("所需的时间是%dms\n",t);
return 0;
}
void CreateMaze(int **maze, int x, int y) {/*声明指向指针的指针*/
maze[x][y] = ROUTE;
//确保四个方向随机
int direction[4][2] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
for (int i = 0; i < 4; i++) {
int r = rand() % 4;
我们再次加深了对随机深度优先,随机广度优先和随机普利姆算法的理解,并掌握如何利用二维数组来定义迷宫的方法;