我实际上是用C编写一个程序来生成完美的迷宫。我在ruby中找到了这个代码:https://gist.github.com/jamis/755866#file-recursive-backtracker2-rb,我将它翻译成C.直到一切都正确,算法可以正确生成迷宫。
我的问题是,那些迷宫需要打印三个字符。我只想要打印两个字符。我试图修改打印模式,但它只是不起作用。
例如,我想要一个这样的迷宫:
#################################
# # # # # # #
# # ######### # # ### ### # # # #
# # # # # # # # # #
# ### ##### ### ####### # # ### #
# # # # # # # # #
# ##### # ### ### ### # ##### # #
# # # # # # # # # # #
# # # ##### ### ### ####### # # #
# # # # # # # # # # #
### # # ##### # # ### # # ##### #
# # # # # # #
# ####### ### ############# # # #
# # # # # # # #
# ############### ### # # ### # #
# # # # #
#################################
它的打印方式如下:
___________________
|_ | _ _______ |
| | |_| _| | _| |
| |_ | |_ |_ | _|
| |___| _| _| | |
| | _| _ |___| | |
| |_| _| |___ |_ |
| | _| ___| ___| |
| _|_ | ___| ___|
|_ | |_ | _|_ |
|_____|___|_________|
任何人都知道我应该怎么做以我想要的方式打印迷宫?我可以修改迷宫的尺寸或其他任何东西,我只想打印只有两个字符。
对于你的双字母迷宫,你需要两倍的行数。
用连续行中的两个|
替换每个#
。
用第一排的_
替换每个,在第二排用
#
替换。
用连续行中的两个替换每个
。
如果纵横比不满意,请将列加倍并使用每个字母两次。
'|' to '#' in row 1
'#' in row 2
'_' to ' ' in row 1
'#' in row 2
' ' to ' ' in row 1
' ' in row 2
例如,这将是一个空的1x2迷宫,没有内壁。
_
| |
|_|
代表为
#
# #
# #
# #
###
它忠实地复制输入左上角和右上角的“间隙”/“孔”。 它还演示了“纵横比”问题。
这是我为定量问题提出的替代表示。
##
## ##
## ##
## ##
######
甚至三倍,让它更“方形”。
###
### ###
### ###
### ###
#########
为了填补漏洞,您必须在输入中检测它们(我认为算法超出范围,但如果不这样,请告诉我)。
._.
| |
|_|
然后你也可以像_
一样替换它们
###
# #
# #
# #
###
(从评论员的最后评论来看,这是令人满意的。我觉得我应该给Aleksei Matiushkin奖励,让我改进我的答案。)
问题中的转换是不可能的。
这是因为在原始表示中,水平墙具有零高度,并且在仅仅锐利的表示中,它们采用单元格来表示。
考虑以下迷宫:
----
| _|
| |
----
在左栏中,我们有两个单元格,在右栏中,我们有三个单元格。当用等宽壁高度表示时,整个迷宫不会保持矩形。
也就是说,迷宫中没有同形变形,条形和下划线到迷宫,其中所有墙壁都具有等宽的宽度和高度。 ⨞
您可以使用两个字符单元来表示您的迷宫,同时考虑到右侧和下方单元格的墙由字符_
和|
表示。
在这个前提下,您将有四种类型的单元格:
" ."
表示。"_."
表示。" |"
表示。"_|"
表示。细胞的上壁和左壁分别由上述细胞和左细胞提供。
值得注意的是,整个迷宫和顶墙也需要左墙。它们可以通过额外的一排._._._._._....
和由|
字符组成的左墙来模拟(这将与你发布的迷宫几乎相似)。
因此,如果我们用一系列字符代表迷宫,问题的可能解决方案可能是:
#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,因此您的代码可能存在一些问题。最好通过查看它来解决您的编码问题。
我已经编写了一个完整的程序来说明打印迷宫的三种方法,包括使用unicode中提供的线条图字符进行打印的可能性。你可以在Github看到它
请参阅How to create a Minimal, Complete, and Verifiable example以获取帮助。