深度遍历实现迷宫生成(纯C语言)

您所在的位置:网站首页 java迷宫生成代码 深度遍历实现迷宫生成(纯C语言)

深度遍历实现迷宫生成(纯C语言)

2024-04-17 08:01| 来源: 网络整理| 查看: 265

迷宫就是一个二维数组,可以给数组元素赋不同的值来表示路和墙。这里我用0表示路,1表示墙。生成迷宫的过程就是先把数组所有元素都置为1(即为墙),然后通过赋值为0(即打破这些墙)来生成迷宫。

一、迷宫的初始化(我使用迷宫大小为7)

首先生成一个n*n(我这里n=7)的二维数组maze,使其全部元素都为1,然后再选取里面一些特殊的元素使其赋值为0,即下图中蓝色的点。该过程的输出就是图中黑色部分的值为1,蓝色部分的值为0。

其次再生成一个k*k(k=n/2,即k为3)的二维数组smaze,刚好对应图中所有的蓝色点。该数组中所有的值全部置为FALSE,表示这些位置都没有被访问。

最后还需要一个结构体一维数组,其大小为3*3=9.该结构体内存储子数组(即图中蓝色的数组)的坐标值。比如struct Point[2]中就存储行数 x = 0; 列数 y = 2

结构体数组与二维数组的关系即二维数组映射到一维数组的关系。P[i]对应的坐标为(i/k,i%k);

倒过来就有smaze[i][j]==r[i*k + 1]

这样迷宫的所有初始化就完成了,接下来就是遍历smaze这个数组来实现迷宫的生成。

二、通过栈实现深度遍历

压栈一个结构体数组元素,我选择的是P[0]

循环弹栈,弹出一个,则将其二维数组中的FALSE改为TURE表示该元素已经被访问了。然后寻找其上下左右没有被访问的元素,找到一个,则将夹在两个蓝色圈中的墙打破,使其变成路,然后找到的未访问的元素入栈。

我这里选择的顺序是上右下左,因此生成的迷宫具有规律性。可以通过选择不同顺序来生成不一样的迷宫,当然若每次循环时顺序都是随机的,那么就实现了一个真正的随机迷宫。

下面为代码:

Push(&s,r[0]); //压栈r[0] while(Pop(&s,&e)) //栈不空时,进行循环 { if(e.x-1>=0 && smaze[e.x-1][e.y]!=TURE) //上 { smaze[e.x-1][e.y] = TURE; maze[2*e.x][2*e.y+1] = a; //打墙 Push(&s,r[(e.x-1)*k+e.y]); } if(e.y+1

为了便于直观,用visual studio做了贴图,结果如下:

下面是可以直接运行的所有代码。因为贴图需要编译器支持graphics包,没有安装VS的不能运行,故我放的是没有做贴图的。

//深度遍历 18-11-3 #include #include #define IN_MAXSIZE 100 #define INCREASE 10 #define SElemType Point #define FALSE 0 #define TURE 1 #define n 7 //迷宫大小 #define k 3 // K = n/2 #define N 9 // N = K*K #define a 0 //a表示路 #define b 1 //b表示墙 typedef struct { int x; //行坐标 int y; //列坐标 }Point; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; int main() { int i,j; int Init_Stack(SqStack *); int Push(SqStack *,SElemType); int Pop(SqStack *,SElemType *); void DFSmaze(Point [],int [][n],int [][k]) ; int maze[n][n]; int smaze[k][k]; Point r[(k)*(k)]; //结构体数组 for(i=0;ibase>=t->stacksize) { t->base = (SElemType *)realloc(t->base,(t->stacksize+INCREASE)*sizeof(SElemType)); if(!t->base) return 0; t->top = t->base + t->stacksize; t->stacksize += INCREASE; } *(t->top++) = e; return 1; } int Pop(SqStack *t,SElemType *e) //出栈 { if(t->top==t->base) return 0; *e = *(--t->top); return 1; } void DFSmaze(Point r[N],int maze[n][n],int smaze[k][k]) //深度优先算法 { SElemType e; //结构体变量e SqStack s; if(Init_Stack(&s)==1) //初始栈 printf("OK\n"); else printf("Fail\n"); Push(&s,r[0]); //压栈r[0] while(Pop(&s,&e)) //栈不空时,进行循环 { if(e.x-1>=0 && smaze[e.x-1][e.y]!=TURE) //上 { smaze[e.x-1][e.y] = TURE; maze[2*e.x][2*e.y+1] = a; //打墙 Push(&s,r[(e.x-1)*k+e.y]); } if(e.y+1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3