在C

时间:2018-12-17 05:43:13

标签: c towers-of-hanoi

我已经编写了代码来解决“河内之塔”难题,但需要帮助格式化输出以打印每个动作的二维表示。我知道我需要使用堆栈来解决此问题,但是我不确定该怎么做。谁能帮我解决这个问题?

项目信息:

“在此项目中,您将传递磁盘数量(不超过15个)作为参数,然后严格按照以下说明显示逐步移动。

每个杆应显示宽度为31个空格,然后在每个杆之后显示5个空格。 棒应使用|来显示。在中间,高度应与磁盘数量相同。每个磁盘应放置在杆上,并具有正确的宽度以反映磁盘的大小。最小的磁盘应显示为两个破折号(在棒的每一侧上一个),第二最小的磁盘应显示为四个破折号(在棒的每一侧上两个),依此类推。可能的最大磁盘应显示为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

此外,我还有逐步说明,可以通过Solver函数正确输出。设置好了。格式化输出是这里的大问题。

0 个答案:

没有答案