如何确保Maze始终具有有效的路径C ++

时间:2016-05-28 04:17:48

标签: c++ algorithm maze

我正在阅读我正在阅读的书中的练习题,问题是要动态生成具有给定高度和宽度的迷宫。这个迷宫也必须始终有一个有效的路径。这是我遇到问题的部分,我无法弄清楚如何确保始终存在有效路径。 这是我的代码,它生成一个迷宫,例如10x10,20x20,30x30等。但有时候没有有效的路径。我尽可能多地评论,以使其更具可读性,因为它有点混乱。 感谢您的任何帮助,您可以提供。

#include<iostream>
#include<cstdlib>
#include<ctime>

int main()
{
int row, height; //declaring row and height int variables.
srand(time(NULL)); //seed for different random number;

std::cout<<"Enter row number: "; //prompts user for row number.
std::cin>>row;
std::cout<<"Enter height number: "; //prompts user for height number;
std::cin>>height;

char **maze; //declaring a pointer to a pointer named maze of type char.
maze=new char*[row]; //pointer points to a array of pointers.

for (int i=0;i<row;++i) //assigning an array to each pointer
{
    maze[i]=new char[row];
}

for (int i=1;i<row;++i) //creating random generation of maze * equal walls/borders.
{
    for (int j=1;j<height;++j)
    {
        int a=rand()%5+1; //if the random number divided by 2 does have a remainder than we place a blank space.
        if (a%2!=0)
        maze[i][j]=0;

        else    //otherwise we place a *, 42 is the ASCII code for *.
        maze[i][j]=42;
    }
}

//the code below creates the borders of the maze and guarantees that there is a exist and entrance to the maze.
//(Entrance is at the top, exit is at the bottom of the maze.
maze[0][0]=42;
maze[0][1]=0;

for (int i=2;i<=row;++i)
{
    maze[0][i]=42;
}

for (int i=1;i<height;++i)
{
    maze[i][0]=42;
}

for (int i=0;i<row;++i)
{
    maze[row-1][i]=42;
}

for (int i=0;i<height;++i)
{
    maze[i][height-1]=42;
}
maze[row-1][height-2]=0;

//This code prints the maze.
for (int i=0;i<row;++i)
{
    for (int j=0;j<height;++j)
    {
        std::cout<<maze[i][j];

    }
    std::cout<<"\n";
}

//deleting the maze freeing it from the heap.
for (int i=0;i<row;++i)
delete[] maze[i];

delete[] maze;


}

3 个答案:

答案 0 :(得分:3)

如果您正在寻找编码解决方案,那么这个答案不适合您。但是,您可以通过以下方式完成任务。

假设:

  

此迷宫也必须始终具有有效路径。

这并不能阻止迷宫使用多种解决方案。

选项A - 简单的暴力

  1. 生成随机迷宫
  2. 测试迷宫的解决方案
  3. 如果没有从#1
  4. 重新开始解决方案

    选项B - 首先创建解决方案

    1. 创建一个起始位置
    2. 创建结束职位
    3. 从头到尾创建随机解决方案路径
    4. 随意填写迷宫的其余部分,而不修改已经填写的任何位置
      • 例如:使用sentinel值初始化整个网格(例如'#',这意味着它还没有被填充),这些将在创建解决方案时被适当的值覆盖最后,当迷宫被随机填充时,只有这些值可能会被覆盖

答案 1 :(得分:2)

确保路径存在的最佳方法是将其放在首位。虽然以前的解决方案:首先创建解决方案然后使用你的算法显然会工作,它可能会创建太容易的迷宫。

取而代之的是,看一下已经建立的generate mazes算法。

特别有意义的是,查看Prim'sKruskal's算法的应用程序(在该维基页面上)并考虑为什么minimum spanning tree确切地生成迷宫。

答案 2 :(得分:0)

我知道我在这篇文章上已经迟到了,但更好的方法是使用递归。

有一个功能可以找到迷宫的起点和终点,以便在开头和结尾用作参考。

让另一个函数find_next_move传递数组,x和y,以及可能的行和列。 x和y通过引用传递。

然后另一个bool函数来验证移动是否为真。 所以它会尝试直接,将这些参数传递给validate_move函数,如果它返回true,则移动,如果为false则尝试其他方向。

在这里使用if else会起作用。然后在if else语句中相应地增加x或y变量。 validate_move函数只能在find_next_move函数中调用。 然后循环遍历,直到解决方案返回true。

但如果你走到了死胡同,你将不得不回溯。所以只需添加if语句

您还可以添加在移动时调用的打印功能,在之前的位置它将打印解决方案的跟踪,如果您必须回溯,则可以删除该跟踪。

我想到的一些基本想法:D