Форматирование 2D вывода для Ханойских Башен в Си - PullRequest
0 голосов
/ 17 декабря 2018

Я написал код для решения головоломки «Ханойские башни», но мне нужна помощь в форматировании выходных данных для печати 2-го представления каждого хода.Я знаю, что мне нужно использовать стеки для решения этой проблемы, но я не уверен, как это сделать.Может кто-нибудь помочь мне найти решение этой проблемы?

Информация о проекте:

"В этом проекте вы передадите количество дисков (не более15) в качестве аргумента, затем отобразите пошаговые шаги в строгом соответствии с приведенной ниже спецификацией.

Каждый стержень должен отображаться с шириной в 31 пробел, а затем с 5 пробелами после каждого стержня. Отображение стержня должно выполняться с помощью |посередине высота должна быть равна количеству дисков. Каждый диск должен быть размещен на стержне, с правильной шириной, чтобы отразить размер диска. Самый маленький диск должен быть показан в виде двух черточек (по одной на каждой сторонестержень), второй наименьший диск должен отображаться в виде 4 штрихов (по 2 на каждой стороне стержня) и т. д. Возможные наибольшие диски должны отображаться в виде 15 штрихов на каждой стороне стержня.стержень к другому стержню, размер должен оставаться неизменным.

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

@@@@@@@@@@@@@@_|_@@@@@@@@@@@@@@&&&&&
@@@@@@@@@@@@@__|__@@@@@@@@@@@@@&&&&&
@@@@@@@@@@@@___|___@@@@@@@@@@@@&&&&&
@@@@@@@@@@@____|____@@@@@@@@@@@&&&&&
@@@@@@@@@@_____|_____@@@@@@@@@@&&&&&
               1
  • 5 столбцов (|) представляют стержень _ представляет диск.
  • @ и & представляют пробелы.
    • @ представляет пространство до и после диска.Если диск самый большой, на обоих концах не будет @.
    • & представляет пространство после стержней.
  • Число под стержнем - номер стержня: 1, 2 или 3. "

Мой код:

#include <stdio.h>
#include <stdlib.h>

int step = 1;   //Global variable

void solver(int size, char fromRod, char toRod, char extraRod);  //Prototyping functionx
int main(int argc, char *argv[]) {   //Main function

   int size, step = 1, i, j, k, width = 1;   //Declaring variables

   if(argc <= 1) {   //Displays error if there is a missing line on the command
      printf("Missing command line argument.\n");
      printf("Usage: ./hanoi numberOfDisks\n");
      exit(1);
   }

   size = atoi(argv[1]);   //Finding size of puzzle from user input

   if (size > 15  || size < 2) {   //If the size is too big or too small displays an error
      printf("Invalid input. Size should be between 1 and 15.\n");
      return -1;
   }

   char setA[size + 1][31], setB[size + 1][31], setC[size + 1][31];   //Tower number only on last row

   solver(size, '1', '3', '2');   //Calls solver function

   return 0;

}

void solver(int size, char fromRod, char toRod, char extraRod) {   //Solver function

   if (size == 1) {   //If size is 1
      printf("%d: Move top disk from %c --> %c\n", step, fromRod, toRod);   //Prints step number and instructions
      return;
   }

   solver(size - 1, fromRod, extraRod, toRod);   //Recursive statement
   step++;   //Increments the number of steps
   printf("%d: Move top disk from %c --> %c\n", step, fromRod, toRod);
   step++;
   solver(size - 1, extraRod, toRod, fromRod);
}

Пример вывода с использованием размера 3:

               |                                   |                                   |                    
             __|__                                 |                                   |                    
            ___|___                               _|_                                  |                    
               1                                   2                                   3
               >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2: move top disk from 1 --> 3

Кроме того, у меня есть пошаговые инструкции, которые правильно выводятся через функцию решателя.Форматированный вывод является большой проблемой здесь.

...