题目4 汉诺塔问题

要求:

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值