问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

能给个数据结构自动生成迷宫图的算法吗?

发布网友 发布时间:2022-05-16 16:21

我来回答

4个回答

热心网友 时间:2023-10-30 21:11

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int M,N;

typedef struct _Position
{
int x;
int y;
}Position;

void Print( int** const );
void Line( int** const p, Position, Position );

int main()
{
srand( (unsigned)time(NULL) );
Position a,b;
int i,j;

printf("请输入迷宫行列:");
scanf("%d %d",&M,&N);
while(getchar()!='\n');

int** const p = (int**) malloc( M*sizeof(int*) );
for( i=0; i<M; i++ )
{
p[i] = (int*) malloc( N*sizeof(int) );
for( j=0; j<N; j++ )
{
p[i][j]=1;
}
}
p[1][1]=p[M-2][N-2]=0;

a.x=M-2;
a.y=N-2;
b.x=1;
b.y=1;
Line( p, a, b );

while(1)
{
a.x=rand()%(M-1)+1;
a.y=rand()%(N-1)+1;
b.x=rand()%(M-1)+1;
b.y=rand()%(N-1)+1;
if( a.x < b.x )
{
i=a.x;
a.x=b.x;
b.x=a.x;
}
Line( p, a, b);
if( rand()%6 ==0 ) break;
}

Print( p );

getchar();
return 0;
}

void Print( int** const dat )
{
int i,j;
for( i=0; i<M; i++ )
{
for( j=0; j<N; j++ )
{
printf("%d",dat[i][j]);
}
printf("\n");
}
printf("\n");
}

void Line( int** const p, Position Fr, Position To )
{
srand( (unsigned)time(NULL) );
int a,b,x,y,i,j;
a=Fr.x;
b=Fr.y;
i=Fr.x-1;
while(i>=To.x)
{
if(i==To.x)
{
j=To.y;
}
else
{
j=rand()%(N-1)+1;
}
p[i][j]=0;
x=i;
y=j;
while(j!=b)
{
p[i][j]=0;
if(p[i+1][j]==0)
{
break;
}
if(j>b)
{
j--;
}
else
{
j++;
}
if(i!=a && (rand()%2)==0)
{
p[i][j]=0;
i++;
}
}
a=x;
b=y;
i=x-1;
}
}

热心网友 时间:2023-10-30 21:11

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <memory.h>

/* define the size of maze */
#define MAX_COL 6
#define MAX_ROW 6
#define TRUE 1
#define FALSE 0
#define IS_USABLE(a, b) (a >= 0 && a < MAX_ROW) && (b >= 0 && b < MAX_COL) && maze[a][b] && (!my_maze[a][b])
static int maze[MAX_ROW][MAX_COL];
static int target_maze[MAX_ROW][MAX_COL];

static void init_maze();
static int move_to(int i, int j, int (*maze)[MAX_COL], int count);
static void print_maze(int (*maze)[MAX_COL]);

static void init_maze()
{
int i, j;

srand((unsigned) time(NULL));

for (i = 0; i < MAX_ROW; i++)
for(j = 0; j < MAX_COL; j++) {
maze[i][j] = (int) (rand() % 2);
}
maze[1][0] = 1; /* start point */
maze[MAX_ROW - 1][MAX_COL - 2] = 1; /* end point */
}

static int move_to(int _i,int _j, int (*in_maze)[MAX_COL], int count) {
int my_maze[MAX_ROW][MAX_COL], i, j;

if (!in_maze) {
for (i = 0; i < MAX_ROW; i++)
for(j = 0; j < MAX_COL; j++) {
my_maze[i][j] = 0;
}
} else {
for (i = 0; i < MAX_ROW; i++)
for(j = 0; j < MAX_COL; j++) {
my_maze[i][j] = in_maze[i][j];
}
}

my_maze[_i][_j] = count;
/* reach the end point */
if (_i == MAX_ROW - 1 && _j == MAX_COL - 2) {
for (i = 0; i < MAX_ROW; i++)
for(j = 0; j < MAX_COL; j++) {
target_maze[i][j] = my_maze[i][j];
}
return TRUE;
}

if (IS_USABLE(_i - 1, _j)) {
if (move_to(_i - 1, _j, my_maze, count + 1))
return TRUE;
}
if (IS_USABLE(_i + 1, _j)) {
if (move_to(_i + 1, _j, my_maze, count + 1))
return TRUE;
}
if (IS_USABLE(_i, _j - 1)) {
if (move_to(_i, _j - 1, my_maze, count + 1))
return TRUE;
}
if (IS_USABLE(_i, _j + 1)) {
if (move_to(_i, _j + 1, my_maze, count + 1))
return TRUE;
}
return FALSE;
}

static void print_maze(int (*maze)[MAX_COL]) {
int i, j;

for (i = 0; i < MAX_ROW; i++) {
for(j = 0; j < MAX_COL; j++) {
if (maze[i][j] != 0)
printf("%d ", maze[i][j]);
else
printf(" ");
}
printf("\n");
}
}

int main()
{
while(1) {
init_maze();
printf("Out put the maze :\n");
print_maze(maze);
if (move_to(1, 0, NULL, 1)) {
printf("Out put the path :\n");
print_maze(target_maze);
break;
} else {
printf("No way!\n");
}
}
}
VC60下正常运行

热心网友 时间:2023-10-30 21:12

我空间里有个迷宫的程序,可以自动生成迷宫,你可以看看。

热心网友 时间:2023-10-30 21:13

只给你算法你知道怎么调用吗?

// =======================================

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char cw[][4]={" ","┃","━","┗","┃","┃","┏","┣",
"━","┛","━","┻","┓","┫","┳","╋"
};
char m[50][50];

char* getw(int x, int y)
{
return cw[(m[x][y-1]?0:1)|(m[x+1][y]?0:2)|(m[x][y+1]?0:4)|(m[x-1][y]?0:8)];
}
int sr(int x,int y)
{
static int d[4][2]={0,1,1,0,0,-1,-1,0};
int zx=x*2,zy=y*2,nx,tn=rand()%2? 1:3,i;
m[zx][zy]=1;
for (i=0,nx=rand()%4;i<4;i++,nx=(nx+tn)%4)
if (m[zx+2*d[nx][0]][zy+2*d[nx][1]]==0)
m[zx+d[nx][0]][zy+d[nx][1]]=1,sr(x+d[nx][0],y+d[nx][1]);
return 0;
}
void Make_Maze(int x,int y)
{
int z1,z2;
for (z1=0,z2=2*y+2;z1<=2*x+2;z1++)m[z1][0]=1,m[z1][z2]=1;
for (z1=0,z2=2*x+2;z1<=2*y+2;z1++)m[0][z1]=1,m[z2][z1]=1;
m[1][2]=1;m[2*x+1][2*y]=1;
srand((unsigned)time(NULL));
sr(rand()%x+1,rand()%y+1);
}
int main(void)
{
int x=10,y=8,z1,z2;Make_Maze(x,y);
for (z2=1;z2<=y*2+1;z2++)
{
for (z1=1;z1<=x*2+1;z1++)printf(m[z1][z2]?" ":getw(z1,z2));
if (z2<=y*2)putchar(10);
}
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 rpg maker xp的制作迷宫问题 寄存器是不是相当于内存条的功能啊? 中国今天是不是炸掉一艘海盗船? 小空开C2A,是不是当电流超过2A就跳闸啊? 中国该如何应对索马里海盗 海盗加勒比海亨特中国船在哪里获得 中国船员是如何对付亚丁湾海盗的? 海盗船内存的中国区域总代理是哪家? 为什么我不在无缘无故的欺负牛啊? 牛和鹅的拓展延伸当同学之间发生不愉快的事该怎么处理? 宝元LNC-M600 报警,显示R40.128伺服驱动器异常,急急急!20分聊表心意! 宝元数控LNC520 怎样与电脑连接呀,急!!网上的视频试过不行 宝元系统在哪修改钻苞启使钻头 建设幸福中国绘画作品,发个图片。急急急急急急急 吴冠中说过幸福是什么? 幸福渠的幸福渠--中国名画 这是幅什么画啊,主题寓意是什么? 2010cctv儿童歌曲大奖赛歌曲展播 找首歌 10分 美术作品《什么是幸福》 绘画作品:小大人的幸福生活 CPU里的寄存器和内存的关系! 梦幻初级帮派迷宫怎么做啊?谁有迷宫地图? 请问cpu 中的寄存器和高速缓存以及内存有什么区别? 读取寄存器与内存的区别 汇编 在边长为1的正方形内任意放入9个点 证明必有3个点 它们构成的三角形面积不大于八分之一 计算机的内存是不是cpu里的寄存器 2012年9月29日4点46出生的男孩,姓蒋。想取个大气又比较有诗意的名字。如:蒋中正这类。 怎么强制进别人限制的QQ空间? 如图,在边长为1的正方形OABC内取一点P(x,y),求:(1)点P到原点距离小于1的概率;(2)以x,y,1为 如图,在边长为1的正方形ABCD的边AB,BC上,取点E,F使∠EDF=45°,已知△BEF的面积为1&#47;6。 在边长为1的正方形ABCD内随机取一点P,则点P到点A的距离小于1的概率为 在边长为1的正方形ABCD内随机取一点P,则点P到点A的距离小于1的概率为 有人租干什么用? 在边长为1的正方形abcd内任意选取一点p,使向量AB×向量AP≤1&#47;2的概率是 在边长为1的正方形abcd内任意选取一点p,使向量AB×向量AP≤1&#47;2的概率是 公司想题八个字,要求:天xxx,源xxx。尽量中正,大气,和谐,天和博是公司名字里的两个字,拜托! 出租有危险吗 在边长为1的正方形中作一个三角形,求三角形面积的最大值。 在边长为1的正方形内,任意放入10个点,证明:必有两个点之间的距离不大于2.5 在边长为1的正方形内,任意放入10个点,证明:必有两个点之间的距离不大于2.5