Hanoi问题递归求解

Hanoi问题递归求解

  1. 问题描述
    设有三个分别命名为A,B,C的塔座,在塔座A上有n个直径各不相同,从小到大依次编号为1,2,3,…n的盘片,现要求将A塔座的n个盘片移到C塔座上并仍按同样顺序叠放,盘片移动必须遵循以下规则:
    每次只能移动一个盘片;盘片可以放在任何一塔座;任何时候都不能将一个较大的盘片放在较小的盘片上。

  2. 递归求解思想
    欲将A上n个盘片通过B移动到C,可先将A上的n-1个盘片通过C移动到B塔座上,再将A上的第n个盘片移动到C上,最后将B塔座上的n-1个盘片通过A移动到C塔座上(思想不是很复杂,但不好理解!!!)。
    《Hanoi问题递归求解》

  3. 举个栗子
    假设此时的n=3(1,2,3号盘片)。
    要想将3个盘片从A移动到C(Hanoi(3,A,B,C))①,先将A上较小的两个(1,2号)通过C(C此时为辅助塔座)从A–>B(Hanoi(2,A,C,B))②,再将3号从A–>C(move(n,A,C),3号最大已经归位),然后将B上的1,2号通过A(A此时为辅助塔座)移到C上就完成了(Hanoi(2,B,A,C))③。
    此时再看②(Hanoi(2,A,C,B)),不难想象,要将两个盘片从A通过C到B,过程如下
    《Hanoi问题递归求解》
    ③过程如下
    《Hanoi问题递归求解》

  4. Hanoi算法

void Hanoi (int n,char A,char B,char C)
{
    if(n==1)cout<<"将第"<<n<<"个盘片从"<<A<<"移动到"<<"C"<<endl;
    else
    {
        Hanoi(n-1,A,C,B);
        cout<<"将第"<<n<<"个盘片从"<<A<<"移动到"<<"C"<<endl;//Move(),
        Hanoi(n-1,B,A,C);
    }
}
    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/qq_34945661/article/details/72824761
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞