zeerd's blog         Search     Categories     Tags     Feed

闲来生雅趣,无事乐逍遥。对窗相望雪,一盏茶香飘。

使用C++生成一个二维迷宫

#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
#############
#   # # #   #
# ### # ### #
# #   # #   #
# # ### # ###
#   #       #
### # ### # #
#     #   # #
#############