递归 汉诺塔问题中的移动过程

因前期一直不理解汉诺塔的移动问题 所以借此休息时刻重新学习

图例:

口述一下过程(三个方块的移动):三个方块从小到大为123

3移动到c的过程:(此时123在a)

    3从a移动到c 前提12移动到b(中转)

    2从a移动到b 前提1移动到c (中转)

2移动到c的过程:(此时12在b)

    2从b移动到c 前提1移动到a(中转)

1移动到c的过程:(此时1在a)

    1从a移动到c(不需要中转,因为1是最小的)

 思路:

移动两块方块及以上时

起始位置移动到目标位置需要借助中转位置

起始,中转,目标 位置是变化的

规定了起始位置,目标位置,那么剩下的位置就为中转位置

例:A移动到C B为中转       C移动到B A为中转

代码实现

#include<stdio.h>
// 三根柱子     
//             |     |     |
//             |     |     |
//             A     B     C
// 1: a->c
// 2: a->b a->c b->c
// 3: a->c a->b c->b a->c b->a b->c a->c
void move(char pos1,char pos2)
{
	printf("%c->%c \n", pos1, pos2);
}
//                起始位置 中转位置 目的位置
void hanoi(int n,char pos1,char pos2,char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);//将盘子从起始位置挪动到目的位置
	}
	else
	{                              // 因为无法直接移动到目的位置 所以要借助另一个未使用的位置当中转位置
		hanoi(n - 1, pos1, pos3, pos2);//将最大的盘子之外的所有盘子通过c(中转位置)移动到b(目的位置)
		move(pos1, pos3);            //移动
		hanoi(n - 1, pos2, pos1, pos3);//再把(b上)最大的盘子之外的所有盘子
		                                 //从b通过a(中转位置)移动到c(目的位置)
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C');
	return 0;
}

运行结果:

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值