深度优先生成迷宫(算法)

迷宫°是我们小的时候经常玩的游戏,可能我们小的时候对这个游戏比较好奇,大多数并没有在意其中存在的一些原理。本文讲述的是基于深度优先的随机迷宫生成算法(C语言版),相信对大家能够有所帮助。

首先,迷宫算法有三种,分为深度优先算法、prim算法和递归分割算法。我们这里讨论的是深度优先算法。

37e7382976b34f019336d72ae356425c.jpg

 ea04280efced4f358f61087c7aa4a0a3.jpg

 经过实验,我们发现该随机迷宫生成算法在处理大型迷宫时存在一定的性能问题。具体来说,当迷宫的大小增加时,算法的运行时间和空间复杂度均呈现出线性增长的趋势,时间复杂度为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;

我们再次加深了对随机深度优先,随机广度优先和随机普利姆算法的理解,并掌握如何利用二维数组来定义迷宫的方法;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值