【发布时间】:2017-01-09 17:41:02
【问题描述】:
我想学习如何生成一个完美的迷宫。我试图理解递归除法算法。我不明白如何实现这个算法。这是我的代码:
bool maze[20][20];
void initMaze()
{
for(int i = 0; i < 20; i++)
for(int j = 0; j < 20; j++)
maze[i][j] = false;
for(int i = 0; i < 20; i++)
maze[0][i] = true;
for(int i = 0; i < 20; i++)
maze[19][i] = true;
for(int i = 0; i < 20; i++)
maze[i][0] = true;
for(int i = 0; i < 20; i++)
maze[i][19] = true;
}
int randNum(int min, int max)
{
return rand()%(max-min+1)+min;
}
void drawVWall(int minY, int maxY, int x)
{
int passage = randNum(minY, maxY);
for(int i = minY; i <= maxY; i++)
if(i != passage)
maze[i][x] = true;
}
void drawHWall(int minX, int maxX, int y)
{
int passage = randNum(minX, maxX);
for(int i = minX; i <= maxX; i++)
if(i != passage)
maze[y][i] = true;
}
void divison(int x, int y, int maxx, int maxy, int h)
{
if(h)
{
if(maxx <= 2)
return;
int wallY = randNum(y, maxy);
drawHWall(x, maxx, wallY);
if(wallY < maxy - wallY)
divison(x, wallY, maxx, maxy, !h);
else if(wallY > maxy - wallY)
divison(x, y, maxx, wallY, !h);
}
else
{
if(maxy <= 2)
return;
int wallX = randNum(x, maxx);
drawVWall(y, maxy, wallX);
if(wallX < maxx - wallX)
divison(wallX, y, maxx, maxy, !h);
else if(wallX > maxx - wallX)
divison(x, y, wallX, maxy, !h);
}
}
initMaze();
divison(2, 2, 18, 18, true);
这段代码有问题,因为它经常冻结程序(某处的无限循环),但如果它有效,它会生成一个像这样的“迷宫”: Generated 'maze'
我不想问你我的代码。我只是想了解如何实现这个算法,我哪里错了,我应该怎么做。我需要生成一个没有封闭区域的完美迷宫。
【问题讨论】:
-
递归似乎难倒很多人。一个常见的聪明的说法是:“一个人必须理解递归才能理解递归。”您可以从这个项目中退后一步,尝试使用更简单的问题来理解递归。这是 Wikipedia 的链接以开始使用。 en.wikipedia.org/wiki/Recursion.
-
查看这个可爱的debug 博客寻求帮助。从您到目前为止的帖子来看,您似乎没有做太多调试程序。您没有描述您对 RDA 的理解不足的地方,或者您的程序与您所理解的不匹配的地方。简而言之,“我不明白”和“它只是给了我这个 blob”不足以描述问题。
-
请注意,递归除法会产生丑陋的迷宫,因为长长的顶层墙很突出。见:weblog.jamisbuck.org/2011/1/12/…
-
非常感谢您的回答。
标签: c++ algorithm recursion maze