我已经编写了代码来解决“河内之塔”难题,但需要帮助格式化输出以打印每个动作的二维表示。我知道我需要使用堆栈来解决此问题,但是我不确定该怎么做。谁能帮我解决这个问题?
项目信息:
“在此项目中,您将传递磁盘数量(不超过15个)作为参数,然后严格按照以下说明显示逐步移动。
每个杆应显示宽度为31个空格,然后在每个杆之后显示5个空格。 棒应使用|来显示。在中间,高度应与磁盘数量相同。每个磁盘应放置在杆上,并具有正确的宽度以反映磁盘的大小。最小的磁盘应显示为两个破折号(在棒的每一侧上一个),第二最小的磁盘应显示为四个破折号(在棒的每一侧上两个),依此类推。可能的最大磁盘应显示为15杆的两边都有破折号。当磁盘从一根杆移动到另一根杆时,大小应保持不变。
例如,如果有5个磁盘,则应在棒上将其显示为:
@@@@@@@@@@@@@@_|_@@@@@@@@@@@@@@&&&&&
@@@@@@@@@@@@@__|__@@@@@@@@@@@@@&&&&&
@@@@@@@@@@@@___|___@@@@@@@@@@@@&&&&&
@@@@@@@@@@@____|____@@@@@@@@@@@&&&&&
@@@@@@@@@@_____|_____@@@@@@@@@@&&&&&
1
我的代码:
#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函数正确输出。设置好了。格式化输出是这里的大问题。