我实际上是用C编写一个程序来生成完美的迷宫。我在ruby中找到了这段代码:https://gist.github.com/jamis/755866#file-recursive-backtracker2-rb,然后用C进行了翻译。直到一切都正确并且算法可以正确生成迷宫。
我的问题是,那些迷宫需要打印三个字符。而且我只想打印两个字符。我试图修改打印模式,但无法正常工作。
例如,我想要一个这样的迷宫:
#################################
# # # # # # #
# # ######### # # ### ### # # # #
# # # # # # # # # #
# ### ##### ### ####### # # ### #
# # # # # # # # #
# ##### # ### ### ### # ##### # #
# # # # # # # # # # #
# # # ##### ### ### ####### # # #
# # # # # # # # # # #
### # # ##### # # ### # # ##### #
# # # # # # #
# ####### ### ############# # # #
# # # # # # # #
# ############### ### # # ### # #
# # # # #
#################################
它打印如下:
___________________
|_ | _ _______ |
| | |_| _| | _| |
| |_ | |_ |_ | _|
| |___| _| _| | |
| | _| _ |___| | |
| |_| _| |___ |_ |
| | _| ___| ___| |
| _|_ | ___| ___|
|_ | |_ | _|_ |
|_____|___|_________|
有人知道我该怎么做才能以我想要的方式打印迷宫吗?我可以修改迷宫或其他任何东西的尺寸,我只想只用两个字符打印。
答案 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。