24h購物| | PChome| 登入
2013-05-19 21:28:29| 人氣8,108| 回應0 | 上一篇 | 下一篇

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

推薦 0 收藏 0 轉貼0 訂閱站台

參考: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;
}

台長: Morris
人氣(8,108) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 其他題目 |
此分類下一篇:[編譯器][作業] Predict Set
此分類上一篇:[POJ][掃描線] 2489 - Line Segments

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文