仅使用两个字符打印迷宫

问题描述 投票:-1回答:3

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

我的问题是,那些迷宫需要打印三个字符。我只想要打印两个字符。我试图修改打印模式,但它只是不起作用。

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

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

它的打印方式如下:

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

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

c arrays ruby maze
3个回答
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奖励,让我改进我的答案。)


2
投票

问题中的转换是不可能的。

这是因为在原始表示中,水平墙具有零高度,并且在仅仅锐利的表示中,它们采用单元格来表示。

考虑以下迷宫:

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

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

也就是说,迷宫中没有同形变形,条形和下划线到迷宫,其中所有墙壁都具有等宽的宽度和高度。 ⨞


1
投票

您可以使用两个字符单元来表示您的迷宫,同时考虑到右侧和下方单元格的墙由字符_|表示。

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

  • 没有较低壁和没有右壁的细胞,这将由序列" ."表示。
  • 只有下壁的细胞。该细胞将由序列"_."表示。
  • 只有右墙的细胞。该细胞将由序列" |"表示。
  • 一个有两面墙的牢房。该细胞将由序列"_|"表示。

细胞的上壁和左壁分别由上述细胞和左细胞提供。

值得注意的是,整个迷宫和顶墙也需要左墙。它们可以通过额外的一排._._._._._....和由|字符组成的左墙来模拟(这将与你发布的迷宫几乎相似)。

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

#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);
}

上面的程序打印迷宫:

._._._._._._._._._._.
|_. | ._. ._._._._. |
| | |_| ._| . | ._| |
| |_. | |_. |_. | ._|
| . |_._| ._| ._| | |
| | ._| ._. |_._| | |
| |_| ._| |_._. |_. |
| | ._| ._._| ._._| |
| ._|_. | ._._| ._._|
|_. | . |_. | ._|_. |
|_._._|_._|_._._._._|

在这种情况下,你需要正好相反,你需要,然后你需要每个单元格打印两行,因为单元格将为每个单元格使用四个字符位置,分为两行,每行两个字符:在第一行,你发出一个空格,然后是右墙的内容,在下一行你发出下墙,然后是右下角(一列,内容丰富):

接下来是相同的程序,但修改了print_maze函数进行打印:#include

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,因此您的代码可能存在一些问题。最好通过查看它来解决您的编码问题。

EDIT

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

请参阅How to create a Minimal, Complete, and Verifiable example以获取帮助。

© www.soinside.com 2019 - 2024. All rights reserved.