汉诺塔(梵塔)问题

汉诺塔(梵塔)问题几乎是所有的初学编程的人遇到的问题,这个问题很好的运用了递归的特性,将原来看起来不好解决的问题变得异常简单,而且很容易理解。问题所有的人都知道就不描述了,代码很简单且有注释就不解释了

#include<iostream>
using namespace std;
int cnt=1;  //step计数
void hanoi(int n,char A,char B,char C);
int main()
{
    int n;
    char A,B,C;
    cout<<"3个柱子编号A B C,将圆盘从A借助C移到B,输入圆盘个数"<<endl;
    cin>>n;
    A='A'; B='B'; C='C';
    hanoi(n,A,B,C);         //将n个圆盘从A借助C移动到B
    return 0;
}
void hanoi(int n,char A,char B,char C)
{
    if(n==1)    //如果只有一个圆盘,直接移动就可以了
        cout<<cnt++<<" "<<A<<"-->"<<B<<endl;
    else{//大于一个圆盘时,先将前n-1个移到C上,然后将最后一个移到B上,最后再把C上的n-1个圆盘移到B上
        hanoi(n-1,A,C,B);
        cout<<cnt++<<" "<<A<<"-->"<<B<<endl;
        hanoi(n-1,C,B,A);
    }
}

PS:这个问题很简单,但是突然想到如果这个问题不是只有3个柱子,而是要求输入有n个圆盘,有m个柱子可以用,应该怎么做。通过大于3个的柱子容易证明必然会得到更好的解,也就是解随柱子的个数是单调不升的。
最开始以为会和原问题差不多的简单,但是后来写了几个递推式看了一下都不对,太晚了,有空再想想吧

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