仅使用两个字符打印迷宫

时间:2019-04-01 09:53:01

标签: c arrays ruby maze

我实际上是用C编写一个程序来生成完美的迷宫。我在ruby中找到了这段代码:https://gist.github.com/jamis/755866#file-recursive-backtracker2-rb,然后用C进行了翻译。直到一切都正确并且算法可以正确生成迷宫。

我的问题是,那些迷宫需要打印三个字符。而且我只想打印两个字符。我试图修改打印模式,但无法正常工作。

例如,我想要一个这样的迷宫:

#################################
# #           #     #     # #   #
# # ######### # # ### ### # # # #
# #       #   # #     #   # # # #
# ### ##### ### ####### # # ### #
#     #     #   #     # # #   # #
# ##### # ### ### ### # ##### # #
# # #   # #   #   #   #     # # #
# # # ##### ### ### ####### # # #
#   # #     # # # #   #   #   # #
### # # ##### # # ### # # ##### #
#   #   #   #       #   #       #
# ####### ### ############# # # #
# #             #     #   # # # #
# ############### ### # # ### # #
#                 #     #     # #
#################################

它打印如下:

 ___________________
|_  |  _   _______  |
| | |_|  _|   |  _| |
| |_  | |_  |_  |  _|
|   |___|  _|  _| | |
| |  _|  _  |___| | |
| |_|  _| |___  |_  |
| |  _|  ___|  ___| |
|  _|_  |  ___|  ___|
|_  |   |_  |  _|_  |
|_____|___|_________|

有人知道我该怎么做才能以我想要的方式打印迷宫吗?我可以修改迷宫或其他任何东西的尺寸,我只想只用两个字符打印。

3 个答案:

答案 0 :(得分:2)

对于两个字母的迷宫,您需要两倍的行数。
在连续的行中将每个|替换为两个#
在第一行中将每个_替换为,在第二行中将其替换为#
在连续的行中将每个替换为两个
如果长宽比不令人满意,请将列也加倍,并使用每个字母两次。

'|' to '#' in row 1
       '#' in row 2

'_' to ' ' in row 1
       '#' in row 2

' ' to ' ' in row 1
       ' ' in row 2 

例如,这将是一个没有内壁的空1x2拉比林特。

 _
| |
|_|

表示为

 #
# #
# #
# #
###

它忠实地在输入的左上角和右上角复制“间隙” /“孔”。
它还演示了“长宽比”问题。

这是我为口粮问题提议的替代表示形式。

  ##
##  ##
##  ##
##  ##
######

甚至三倍,使其更加“方形”。

   ### 
###   ###
###   ###
###   ###
#########

为了填补漏洞,您必须在输入中检测到它们(我认为该算法超出范围,但是如果您不这样做,请告诉我)。

._.
| |
|_|

然后,您也可以像_一样替换它们并获取

###
# #
# #
# #
###

由提问者的最后评论判断,这是令人满意的。我认为我应该赞扬Aleksei Matiushkin改善我的回答。

答案 1 :(得分:2)

问题不可能进行转换

这是因为在原始表示中,水平墙的高度为零高度,而在仅采用尖锐的表示中,它们使用了一个单元格来表示。

考虑以下迷宫:

----
| _|
|  |
----

在左列中,我们有两个单元格,在右列中,我们有三个单元格。用等高的壁高表示时,整个迷宫不会保持矩形

那是说,迷宫没有条形和下划线的同构转换,到迷宫中所有壁的宽度和高度都是等距的。 ⨞

答案 2 :(得分:1)

您可以仅使用两个字符单元格来表示迷宫,请注意,右侧和下部单元格的墙由字符myAppHost://myAppScheme_表示。

在此前提下,您将拥有四种类型的单元格:

  • 一个没有下部且没有右侧壁的​​单元,将由序列|表示。
  • 仅具有下壁的单元。此单元格将由序列" ."表示。
  • 只有右墙的牢房。此单元格将由序列"_."表示。
  • 两面都有壁的单元。此单元格将由序列" |"表示。

一个单元的上壁和左壁分别由上述单元和左单元提供。

值得注意的是,整个迷宫都需要一个左墙和一个顶墙。可以通过"_|"的额外行和._._._._._....字符组成的左墙来模拟它们,得到(这几乎类似于您作为示例发布的迷宫。

因此,如果我们用一系列字符表示迷宫,则可能的解决方案是:

|

上面的程序打印迷宫:

#include <stdio.h>

void print_maze(FILE *f, char *maze, int rows, int cols)
{
    /* maze is an array that has rows * cols cells.
     * Each cell is a bitmap where bit 0 represents the
     * right wall, while bit 1 represents the low wall.
     */
#define LOWER_WALL (1 << 1)
#define RIGHT_WALL (1 << 0)
    int r, c;
    /* top wall */
    fputc('.', f);
    for (c = 0; c < cols; c++)
        fputs("_.", f);
    fputc('\n', f);
    for (r = 0; r < rows; r++) {
        fputc('|', f);
        for (c = 0; c < cols; c++) {
            fputs(*maze & LOWER_WALL ? "_" : " ", f);
            fputs(*maze & RIGHT_WALL ? "|" : ".", f);
            maze++;
        }
        fputc('\n', f);
    }
} /* print_maze */

char *maze = "2102022221"
             "1130301031"
             "1211212103"
             "0123030311"
             "1030212311"
             "1303122121"
             "1030230231"
             "0321023023"
             "2101210321"
             "2232322223";

int main()
{
    print_maze(stdout, maze, 10, 10);
}

在这种情况下,您需要按相反的方向进行操作,然后每个单元格需要打印两行,因为该单元格将为每个单元格使用四个字符位置,分为两行,每行两个字符:在第一行中,您发出一个空格._._._._._._._._._._. |_. | ._. ._._._._. | | | |_| ._| . | ._| | | |_. | |_. |_. | ._| | . |_._| ._| ._| | | | | ._| ._. |_._| | | | |_| ._| |_._. |_. | | | ._| ._._| ._._| | | ._|_. | ._._| ._._| |_. | . |_. | ._|_. | |_._._|_._|_._._._._| ,然后是右墙的内容,在下一行中,您发出的是下墙,然后是右下角(一列,内容已满):

下一个是相同的程序,但是修改了函数以进行打印:     #include

print_maze

打印:

void print_maze(FILE *f, char *maze, int rows, int cols)
{
    /* maze is an array that has rows * cols cells.
     * Each cell is a bitmap where bit 0 represents the
     * right wall, while bit 1 represents the low wall.
     */
#define LOWER_WALL (1 << 1)
#define RIGHT_WALL (1 << 0)
    int r, c;
    /* top wall */
    fputc('#', f);
    for (c = 0; c < cols; c++)
        fputs("###", f);
    fputc('\n', f);
    for (r = 0; r < rows; r++) {
        fputc('#', f);
        /* first row of the row :) */
        for (c = 0; c < cols; c++) {
            fputs(*maze & RIGHT_WALL ? "  #" : "   ", f);
            maze++;
        }
        fputs("\n#", f);
        maze -= cols;
        for (c = 0; c < cols; c++) {
            fputs(*maze & LOWER_WALL ? "###" : "  #", f);
            maze++;
        }
        fputc('\n', f);
    }
} /* print_maze */

char *maze = "2102022221"
             "1130301031"
             "1211212103"
             "0123030311"
             "1030212311"
             "1303122121"
             "1030230231"
             "0321023023"
             "2101210321"
             "2232322223";

int main()
{
    print_maze(stdout, maze, 10, 10);
}

下次,请显示您的代码,因为StackOverflow是一个论坛,可以帮助您解决编程问题,而不是做功课。您说您已经将ruby代码转换为C,所以您的代码可能存在一些问题。最好看看一下就能解决您的编码。

编辑

我已经编写了一个完整的程序来说明三种打印迷宫的方法,包括使用unicode中可用的线条图字符进行打印的可能性。您可以在Github

中看到它

有关此方面的帮助,请参见How to create a Minimal, Complete, and Verifiable example