要求:
1.以图形界面显示出待移动的汉诺塔(最多5个),个数可由用户选则。
2.开始演示后逐步演示汉诺塔的移动过程,并统计移动过程中的步骤数。
3.规定:程序中有合理的提示信息,以合理的形式输入数据、存储数据,并以合理的形式输出程序结果。可以使用C语言也可以使用Java语言实现程序设计。
#include <stdio.h>
#include <stdlib.h>
#define MAX_DISKS 5
#define NUM_PEGS 3
typedef struct {
int disks[MAX_DISKS];
int top;
} Peg;
Peg pegs[NUM_PEGS];
int num_disks;
int move_count = 0;
void init_pegs(int n) {
for (int i = 0; i < NUM_PEGS; i++) {
pegs[i].top = -1;
}
for (int i = n; i > 0; i--) {
pegs[0].disks[++pegs[0].top] = i;
}
}
void print_pegs() {
for (int i = 0; i < NUM_PEGS; i++) {
printf("柱子 %d: ", i + 1);
for (int j = 0; j <= pegs[i].top; j++) {
printf("%d ", pegs[i].disks[j]);
}
printf("\n");
}
printf("\n");
}
void move_disk(int from, int to) {
int disk = pegs[from].disks[pegs[from].top--];
pegs[to].disks[++pegs[to].top] = disk;
move_count++;
printf("移动圆盘 %d 从柱子 %d 到柱子 %d\n", disk, from + 1, to + 1);
print_pegs();
}
void hanoi(int n, int from, int to, int aux) {
if (n == 1) {
move_disk(from, to);
return;
}
hanoi(n - 1, from, aux, to);
move_disk(from, to);
hanoi(n - 1, aux, to, from);
}
int main() {
printf("请输入圆盘数量 (1-%d): ", MAX_DISKS);
scanf("%d", &num_disks);
if (num_disks < 1 || num_disks > MAX_DISKS) {
printf("无效的圆盘数量,请输入1到%d之间的数字。\n", MAX_DISKS);
return 1;
}
init_pegs(num_disks);
printf("初始状态:\n");
print_pegs();
hanoi(num_disks, 0, 2, 1);
printf("总共移动了 %d 步。\n", move_count);
return 0;
}