2013-05-19 21:28:29Morris

[深度優先] 隨機迷宮生成

參考:http://www.4ngel.net/article/17.htm



MakeMazeDemo.PNG


[深度優先] 隨機迷宮生成


生成迷宮的算法,從生成樹(廣度建造、深度建造) 到遞迴分割建造。
被人問了,被激起思路就想寫寫。
(*´д`)彡 你要負起責任呀。

基本上生出來的迷宮一定是一棵樹。
使用參考網址中的第二方法。



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int g[105][105], used[105][105];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int n, m;
char ret[105][105];
void dfs(int x, int y, int px, int py) {
    if(x < 0 || y < 0 || x >= n || y >= m)
        return;
    if(used[x][y])
        return;
    used[x][y] = 1;
    if(px >= 0) {
        ret[((x*2+1)+(px*2+1))/2][((y*2+1)+(py*2+1))/2] = '.';
    }
    ret[x*2+1][y*2+1] = '.';
    int cnt = 0, dir = 0;
    if(x == n-1 && y == m-1)    return;
    while(cnt < 10) {
        dir = rand()%4;
        dfs(x+dx[dir], y+dy[dir], x, y);
        cnt++;
    }
}
int main() {
    srand (time(NULL));
    while(scanf("%d %d", &n, &m) == 2) {
        memset(g, 0, sizeof(g));
        memset(used, 0, sizeof(used));
        memset(ret, '#', sizeof(ret));
        dfs(0,0, -1,-1);
        int i, j;
        for(i = 0; i <= 2*n; i++) {
            for(j = 0; j <= 2*m; j++) {
                printf("%c", ret[i][j]);
            }
            puts("");
        }
    }
    return 0;
}