使用C++生成一个二维迷宫
Charles Chan @ 2022-12-16 #Maze @Program
Contents:
原帖在 这里 。 我使用C++重写了一遍。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
int c = 15;
int r = 5;
int **a;
void init(int r, int c)
{
a = (int**)malloc(sizeof(int*)*(2*r+1));
for(int i=0; i<2*r+1; i++) {
a[i] = (int*)malloc(sizeof(int)*(2*c+1));
for(int j=0; j<2*c+1; j++) {
a[i][j] = 1;
}
}
// 中间格子为0
for(int i=0; i<r; i++) {
for(int j=0; j<c; j++) {
a[2*i+1][2*j+1] = 0;
}
}
}
void uninit(int r, int c)
{
for(int i=0;i<2*r+1;i++) {
free(a[i]);
}
free(a);
}
//处理数组,产生最终的数组
void process(void)
{
//acc存放已访问队列,noacc存放没有访问队列
std::vector<int> acc;
std::vector<int> noacc;
int count = r*c;
for(int i=0; i<count; i++){
noacc.push_back(0);
}
//定义空单元上下左右偏移
int offs[4]={-c, c, -1, 1};
int offR[4]={-1, 1, 0, 0};
int offC[4]={ 0, 0, -1 ,1};
//随机从noacc取出一个位置
int pos = ::random() % count;
noacc[pos] = 1;
acc.push_back(pos);
while(acc.size() < count) {
int ls = -1, offPos = -1;
//找出pos位置在二维数组中的坐标
int pr = pos / c, pc = pos % c, co=0, o=0;
//随机取上下左右四个单元
while(++co < 5) {
o = ::random() % 5;
ls =offs[o] + pos;
int tpr = pr+offR[o];
int tpc = pc+offC[o];
if(tpr>=0 && tpc>=0 && tpr<=r-1 && tpc<=c-1 && noacc[ls]==0) {
offPos = o;
break;
}
}
if(offPos < 0) {
pos = acc[::random() % acc.size()];
}
else {
pr = 2*pr+1;
pc = 2*pc+1;
//相邻空单元中间的位置置0
a[pr+offR[offPos]][pc+offC[offPos]]=0;
pos = ls;
noacc[pos] = 1;
acc.push_back(pos);
}
}
}
int main(int argc, char *argv[])
{
if(argc > 2) {
r = atoi(argv[1]);
c = atoi(argv[2]);
}
init(r, c);
process();
for(int i=0; i<2*r+1; i++) {
for(int j=0; j<2*c+1; j++) {
printf("%s", (a[i][j] == 1)?"#":" ");
}
printf("\n");
}
uninit(r, c);
return 0;
}
结果如下:
g++ primmaze.cpp && ./a.out 4 6
#############
# # # # #
# ### # ### #
# # # # #
# # ### # ###
# # #
### # ### # #
# # # #
#############