汉诺塔

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。 问应该如何操作?

在这里插入图片描述
从图中可以看出A柱上的N圆盘是最大的,又因为小圆盘上不能有大圆盘,大圆盘上可以放小圆盘。所以N圆盘上可以放其他所有的任意圆盘,这样的话我们完全可以将N圆盘看成空气,看成没有。那么我们的任务就变成了将从N-1盘1盘按顺序移动到B柱子上。然后将N盘移动到C盘上
在这里插入图片描述
再把B盘上移动到C盘上就行(这时C柱子上的N盘还可以看成空气,再把AB换换位置,又变成将B柱子上的圆盘移动到C柱子上,AB换位置递归来一遍就行)。而对于N-1盘1盘这一堆移动到B柱子上,我们也可以用这样的方法,将N-1看成空气,又变成了N-2到1盘移动到B柱子上。以此类推,直到只剩1圆盘,直接移动到C柱子上就行。

#include <iostream>

using namespace std;

void move(char A, char B){
	cout << "move: " << A << "----->" << B << endl;
}
//其中,n代表盘子总数,x,y,z代表柱子
void hanoi(int n, char A, char B, char C){
	if(n==1){
        move(A,C);//最大的圆盘从A移动到C
    }
    else{ 
        hanoi(n-1, A, C, B);
        move(A,C);
        hanoi(n-1, B, A, C);
    }
}

int main() {
	int n;
	cout << "请输入A柱有多少圆盘" << endl;
	cin >> n;
	cout << "步骤" << endl;
	hanoi(n,'A','B','C');
	return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值