Hanoi塔(递归概念重题)

题面
这里写图片描述
将A盘上的盘子移动到C上面,求步骤,以及步数

题目分析
这是一道很基本的题目,用来理解递归的概念很不错,(请无视我是蒟蒻)
我们可以假设一下:
一个盘子:A——>C
两个盘子:A——>B A——>C B——>C
三个盘子:A——>C A——>B C——>B A——>C
。。。。。。。
总结一下:
①(n-1)个盘子,(A)通过C移动到B;
②第n个盘子直接从A移动到C;
③(n-1)个盘子,(B)通过A移动到C;

代码

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

void move(int d,char a,char b,char c)  //核心
{
    //o++;
    if (d==1) //递归边界
        {
            cout<<"move "<<a<<" to "<<c<<endl;  //触底反弹
        }
            else
                {
                    move(d-1,a,c,b);  //(n-1)个盘子,(A)通过C移动到B;
                    cout<<"move "<<a<<" to "<<c<<endl; //第n个盘子直接从A移动到C;
                    move(d-1,b,a,c); //(n-1)个盘子,(B)通过A移动到C;
                }
}

int n,f[100];
//int o=0;
int main()
{
    cin>>n; //输入

    f[1]=1; //给求Hanoi他的f数组初始化
    f[2]=3;
    f[3]=7;
    for(int i = 4; i <= n; i++)
        f[i]=2*f[i-1]+1;  //递推公式

    move(n,'A','B','C'); //调用函数来移动

    cout<<f[n]; //cout<<o;也可以用一个变量直接在递归函数中累加,计算层数
}
                                                   **蒟蒻新星c_uizrp_dzjopkl原创**

猜你喜欢

转载自blog.csdn.net/c_uizrp_dzjopkl/article/details/81542354