汉诺塔问题(c++实现)

问题描述:有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个金盘。目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

分析:要经过以下几步:
(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;
(2)将A杆中剩下的第n号盘移至C杆;
(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

代码:

#include <iostream>
using namespace std;

void hanoi(int n, char A, char B, char C)
{
    if (n == 1)
    {
        cout << A << "->" << C << endl;
        return;//递归终止
    }
    hanoi(n - 1, A, C, B);//将n-1个盘子从A移到B
    cout << A << "->" << C << endl;
    hanoi(n - 1, B, A, C);//将n-1个盘子从B移到C
    return;

}

void main()
{
    char A = 'A', B = 'B', C = 'C';
    int n;
    cout << "请输入圆盘数量:";
    cin >> n;
    hanoi(n, A, B, C);
    system("pause");
}

理解:刚才步骤中的1和3。最主要的差别是从ACB变为BAC。因为B在这里充当了之前A的角色,A充当了之前C的角色,C充当了之前B的角色(辅助柱子是不一样的)。然后其实这是一个递归(分治)问题,递归问题主要是要找到n和n-1之间的联系。当n-1和n的操作类似时,就可以使用递归(逆推的思想)。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/yogima/article/details/79659145
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞