Hanoi 问题

Hanoi 塔

Problem Description

在柱子A上有 n 个 盘子,按从小到大的顺序从上到下排列,要将其移到柱子 C 上,可以借助 B 柱子,其中 B 柱子和 C 柱子都是空的。
要求:

  1. 每次只能移动一个盘子
  2. 每根柱子上的盘子都必须按照从小到大从上到下的顺序排列

分析

当A上面有N个盘子,如果我把N-1个盘子已经搬到了B上面,我只需要将A上的最后一个盘子放到C上面,第N个盘子的直径是最大的,再以后的搬动过程中是不需要动C上第N个盘子的。以上搬动N个盘子的问题,就变为搬N-1个盘子的问题,只是现在是 B 上面有( n - 1 )个盘子,而 A 上面没有盘子。不断继续下去,最后只有一个圆盘的时候,问题就解决了。

这种方式适合递归算法

有递归出口,那就是当盘子只有一个时候,移动到 C 上
使问题规模缩小,并是同一类问题
     1. 将N-1个盘子从A 搬到B柱上面,(借助C)
     2. 将A柱子上第N个盘子搬到C柱上面
     3. 将B柱子上N-1个盘子搬到C柱子上面 (借助A)

代码

在这个代码中,“ hanoi(n-1,A,C,B) ” 和 “ hanoi(n-1,B,A,C) ”一个调换了 后两个的顺序,后一个调换了前两个的顺序(原来的顺序是 ( A,B,C)),输出的话,一直输出的是变量 A 到 C 的移动。

#include<bits/stdc++.h>
using namespace std;

void hanoi(int n,char A,char B,char C)
{
    if(n==1)
    {
      printf("Move disk %d from %c to %c\n",1,A,C);
    }
    else
    {
      hanoi(n-1,A,C,B);
      printf("Move disk %d from %c to %c\n",1,A,C);
      hanoi(n-1,B,A,C);
    }
}  

int main()
{
    int n;
    while(cin>>n)
	{ 
    	hanoi(n,'A','B','C');	
	} 
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值