生成的结果示例:
━━━━┳━━┳━━┳━━━━━━┳━┓
┃━━━┓┗━┏┛┏┓┃━┳┓━━━┫┃┃
┣━━┓┣━┓┃━┫┃┗━┃┗━━┓┃┃┃
┃┏━┃┃━┫┣┓┃┣━━┻━━┓┣━┛┃
┃┣━━┻┓┃┃┣━┃━┳━┳━┃┃┏━┃
┃┃┏┳━┣━━┫┏┻┓┃┃┗┓┏┛┃━┫
┃┏┛┃━┫┏━┃┃┃┃┃┣┓┗┛┏┻━┃
┃┃┃┗┓┃┃┏┻━┫┏┛┃┃┏━┻┓━┫
┃┃┣━┗━┫┃━┓┃┃┏┛┃┃┏━┣━┃
┃┗┫┃┏━┻┳┓┗┳┫┃┃┃┃┃┏┻┓┃
┣━┃┃┃━┳┛┗━┃┃┃┗┳┛┃┃┃┗┫
┃┏┛┃┗┓┗━━┳━┃┗━┛━┻━┻┓┃
┃┃┃┗━┻━┳━┃┏┻━━┓┏━━━┛┃
┃┗┻┳━┏━┛┏┻┫┏━┓┃┃━━┳━┃
┣━━┃┃┃━━┛┃┃┃┃┃┗┻━━┃━┫
┗━━━┻┻━━━┻━┻┻━━━━━┻━
还能更短一些,比如改成格子形式的输出,那段放后面吧,现在先给出上图的生成代码
源代码(共25行):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int fy[500][500];
int d[][2] = {{0, 1},{1, 0},{0, -1},{-1, 0}};
char yzfy[][4]={" ","┃","━","┛","┃","┃","┓","┫",
"━","┗","━","┻","┏","┣","┳","╋"};
int w=20, h=15, rw = w+2, rh = h+2;
int dfs(int y, int x){
if (fy[y][x]) return 0; else fy[y][x] |= 0x10;
for (int f=rand()%4, i=0, p=rand()&1?3:1, u,v; i<4; ++i,f=(f+p)%4)
if (dfs(v=y+d[f][0], u=x+d[f][1]))
fy[y][x] |= 1<<f, fy[v][u] |= (1<<((f+2)%4));
return 1;
}
int main(){
for (int y=0; y<rh; ++y) fy[y][0]|=10, fy[y][rw-1]|=10;
for (int x=0; x<rw; ++x) fy[0][x]|=5, fy[rh-1][x]|=5;
srand(time(NULL)); dfs(w/2,h/2); fy[1][1] |= 12; fy[rh-2][rw-2] |= 3;
for (int y=1; y<rh; ++y,puts(""))
for (int x=1; x<rw; ++x)
printf("%s", yzfy[15^((fy[y-1][x-1]&3)|(fy[y][x]&12))]);
return 0;
}
以下为最短版本的输出效果:
███████████████████████████████
█ █ █ █
█ ███████ █████ █ █ ███ █ ███ █
█ █ █ █ █ █ █ █ █ █ █
█ █ ███ ███ █ ███ █ █ █████ █ █
█ █ █ █ █ █ █ █ █ █
█ █ █ █████████ █████ █ ███ █ █
█ █ █ █ █ █ █
█████████████████ █ █ ███ █████
█ █ █ █ █ █ █
███████ █████ █ ███ ███ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █
█ ███ ███████ █ █ ███ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █
█ █ █████ █ █ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █
█ █████████████ ███ █ █ █████ █
█ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ ███ █ █ █ █ ███ █
█ █ █ █ █ █ █
███████████████████████████████
生成的源代码(有效行数10):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int fy[500][500];
int d[][2] = {{0,1},{1,0},{0,-1},{-1,0}},w=15,h=10,u=w*2+1,v=h*2+1;//1
int yzfy(int y, int x){//2
if(x<1||y<1||x>=u-1||y>=v-1||fy[y][x])return 0;else fy[y][x]=1;//3
for (int f=rand()%4, i=0, p=rand()&1?3:1; i<4; ++i,f=(f+p)%4)//4
if(yzfy(y+*d[f]*2,x+d[f][1]*2)) fy[y+*d[f]][x+d[f][1]]=1;//5
return 1;//6
}
int main(){
srand(time(NULL)); yzfy(1,1); fy[1][0] = fy[v-2][u-1] = 1;//7
for (int y=0; y<v; ++y,puts(""))//8
for (int x=0; x<u; ++x)//9
printf("%s", fy[y][x]?" ":"█");//10
return 0;
}
出处:www.l1mn.com
原文标题:本人目前最短的迷宫生成算法程序源代码
原文地址:https://www.l1mn.com/p/2zl9w.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
Copyright © L1MN.COM 联系方式:l1mnfw@163.com