Распечатать лабиринт, используя только два символа - PullRequest
0 голосов
/ 01 апреля 2019

На самом деле я пишу программу на C для создания идеальных лабиринтов.Я нашел этот код в ruby: https://gist.github.com/jamis/755866#file-recursive-backtracker2-rb и перевел его на C. До тех пор, пока все не будет правильно и алгоритм не сможет правильно генерировать лабиринты.

Моя проблема в том, что этим лабиринтам нужны три символаРаспечатать.И я хочу, чтобы его печатали только два символа.Я пытался изменить режим печати, но он просто не работает.

Например, я хочу лабиринт, подобный этому:

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

И он печатает так:

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

Кто-нибудь знает, как мне следует печатать лабиринт так, как я хочу?Я могу изменить размеры лабиринта или что-то еще, я просто хочу напечатать только с двумя символами.

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Преобразование в вопросе невозможно .

Это связано с тем, что в исходном представлении горизонтальные стены имеют нулевую высоту , а в представлении только резкоеони взяли ячейку для представления.

Рассмотрим следующий лабиринт:

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

В левом столбце у нас есть две ячейки, а в правом столбце - три ячейки.При представлении с моноширинной высотой стены весь лабиринт не остается прямоугольным .

При этом не происходит изоморфного преобразования лабиринта с решетками и подчеркиваниями в лабиринт, где все стеныимеют моноширинную ширину и высоту.⨞

2 голосов
/ 01 апреля 2019

Для вашего двухбуквенного лабиринта вам нужно вдвое больше строк.
Замените каждый | двумя # в последовательных строках.
Замените каждый _ на в первом ряду и # во втором ряду.
Замените каждый двумя в последовательных строках.
Если вам не нравится соотношение сторон, также удвойте столбцы и используйте каждую букву дважды.

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

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

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

Например, это будет пустой лабиринт 1x2 без внутренних стен.

 _
| |
|_|

Представлено как

 #
# #
# #
# #
###

Он точно копирует "пробелы" / "дыры" во входных верхнем левом и верхнем правом углах.
Это также демонстрирует проблему «пропорций».

Вот альтернативное представление, которое я предложил для задачи о рационе.

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

Или даже втрое, чтобы сделать его более "квадратным".

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

Для того, чтобы заполнить дыры, вы должны обнаружить их во входных данных (этот алгоритм я считаю вне области, но дайте мне знать, если вы этого не сделаете).

._.
| |
|_|

Тогда вы также можете заменить их как _ и получить

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

( Судя по последним комментариям спрашивающих, это удовлетворительно. Я чувствую, что должен отдать должное Алексею Матюшкину за то, что он заставил меня улучшить свой ответ. )

1 голос
/ 02 апреля 2019

Вы можете изобразить свой лабиринт, используя две ячейки символов, учитывая, что стены справа и снизу представлены символами _ и |.

., у вас будет четыре типа ячеек:

  • Ячейка без нижних и без правых стенок, это будет представлено последовательностью " .".
  • Ячейка только снижняя стенкаЭта ячейка будет представлена ​​последовательностью "_.".
  • Ячейка только с правой стенкой.Эта ячейка будет представлена ​​последовательностью " |".
  • Ячейка с обеими стенками.Эта ячейка будет представлена ​​последовательностью "_|".

. Верхняя и левая стенки ячейки будут предоставлены вышеуказанной ячейкой и левой ячейкой соответственно.

Стоит отметить, что вам понадобится левая стена для всего лабиринта, а также верхняя стена.Они могут быть смоделированы с помощью дополнительного ряда ._._._._._.... и левой стены, состоящей из | символов, что дает (это будет почти аналогично лабиринту, который вы выложили в качестве примера.

Итак, если мы представимлабиринт с массивом символов, возможное решение проблемы может быть:

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

Программа выше печатает лабиринт:

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

В этом случае вам нужно простонапротив, как вы хотите, тогда вам нужно напечатать две строки на ячейку, так как ячейка будет использовать четыре позиции символов для каждой ячейки, разделенные на две строки по два символа в каждой: в первой строке выдается пробел с последующимпо содержимому правой стены, и в следующем ряду вы излучаете нижнюю стену, за которой следует правый нижний угол (столбец, полный содержимого):

Далее та же программа, но с *Функция 1036 * изменена для печати: #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, поэтому, вероятно, у вашего кода есть некоторые проблемы.Лучше решить вашу кодировку, взглянув на нее.

РЕДАКТИРОВАТЬ

Я написал полную программу, иллюстрирующую три способа печати лабиринтов, включая возможность печати с использованием символов рисования линий.доступно в юникоде.Вы можете увидеть это в Github

См. Как создать минимальный, полный и проверяемый пример для получения справки по этому вопросу.

...