java - 绘制和表示带有阵列墙的迷宫

标签 java algorithm graph

我正在尝试创建一个具有深度优先搜索的迷宫并且该算法工作正常但我在控制台中实际绘制迷宫并通常表示迷宫时遇到问题。我之前的尝试包括表示网格的每个位置在一个 3x3 的 block 中,如果有一面墙,我会为每个位置画一堵墙,但这会为左/右、上/下的每个方向提供 2 堵墙。我的第二次尝试是尝试将迷宫放入维度为 +(维度 - 1)的二维数组中,并将墙壁视为如下所示的线:

enter image description here

这是我的尝试:

    int dimTemp             =   dim + (dim - 1);
    String[][] mazeDrawn    =   new String[dimTemp][dimTemp];

    int posRow, posCol;
    int nodeRow = 0;
    int nodeCol;

    for(int wallRow = 1; wallRow <= dimTemp; wallRow += 2)
    {
        if(wallRow >= dimTemp)
        {
            wallRow--;
            posRow =   wallRow;
        }   

        else posRow =   wallRow - 1;
        nodeCol =   0;

        for(int wallCol = 1; wallCol <= dimTemp; wallCol += 2)
        {
            if(wallCol >= dimTemp) 
            {
                wallCol--;
                posCol          =   wallCol;
            }

            else posCol = wallCol - 1;

            Node current    =   maze[nodeRow][nodeCol];
            mazeDrawn[posRow][posCol] =   current.getPosValue();

            if(current.right) mazeDrawn[posRow][wallCol] = "#";
            else mazeDrawn[posRow][wallCol] = " ";

            mazeDrawn[wallRow][wallCol] = "#";
            if(current.down) mazeDrawn[wallRow][posCol] = "#";
            else mazeDrawn[wallRow][posCol] = " ";

            nodeCol++;
        }

        nodeRow++;
    }


    for(int row = 0; row < mazeDrawn.length; row++)
    {
        for(int col = 0; col < mazeDrawn.length; col++)
        {
            System.out.print(mazeDrawn[row][col]);
        }
        System.out.println();
    }

这是我运行 DFS 之前 10x10 迷宫的输出,其中每个位置之间都有墙,# 是“墙”和 .是位置

.#.#.#.#.#.#.#.#.##
###################
.#.#.#.#.#.#*#.#.##
###################
.#.#.#.#.#.#.#.#.##
###################
.#.#.#.#.#.#.#.#.##
###################
.#.#.#.#.#.#.#.#.##
###################
.#.#.#.#.#.#.#.#.##
###################
.#.#.#.#.#.#.#.#.##
###################
.#.#.#.#.#.#.#.#.##
###################
.#.#.#.#.#.#.#.#.##
###################
###################

底部和右边缘有问题,应该遵循之前的模式。我不确定这是否是表示迷宫的好方法。 还要澄清一下,我只是想打印到控制台。

最佳答案

您可以很容易地用每个单元格一个字节(实际上是四位)来表示迷宫。为每个单元壁分配一个位。例如:

   0
   _
3 |_| 1

   2

因此,所有四面墙都存在的单元格将表示为二进制 1111 或 15。如果仅存在顶墙和右墙,则值为 0011 或 3。没有墙的单元格的值为 0。

您也可以做得更好。如果您推断迷宫顶部和左侧边缘的所有单元格都存在顶部和左侧壁,那么每个单元格只需要两位。如果您从左上角到右下角绘制迷宫,那么对于每个单元格,您只需要弄清楚底壁或右壁是否存在。没有理由检查左侧或顶部,因为它们会被前一列或前一行绘制。

当然,如果您在第 5 行第 3 列(即单元格 [5, 3]),并且您想知道上面是否有墙,则必须检查单元格 [4, 3] 才能看到如果单元格底部的墙存在。这会增加一点计算量,但可以节省 50% 的空间。

关于java - 绘制和表示带有阵列墙的迷宫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32198377/

相关文章:

Java lambda 表达式 : Combinator-Pattern Improvement

java - 命名 Talend 自定义组件 - 除 tTutorialRow 外不工作

java - 使用泛型的工厂对象创建者

c# - 比较两个数组是否相等的最快方法是什么?

java - 关于泛型和集合的核心java

java - 如何检查一天是否位于范围之间?

algorithm - 如何确定范围列表是否涵盖给定范围?

c++ - 如何使用 Boost 的 vf2_subgraph_iso 检测 multimap 上的子图同构?

algorithm - 寻找具有最大最小权重的路径

algorithm - 寻找树叶的最佳解决方案