递归解决汉诺塔问题+改变规则解决

版权声明:转载请注明出处 https://blog.csdn.net/Zach_z/article/details/81319633

一、汉诺塔问题

1.1 问题描述

三根柱子,其中一根柱子从上到下依次摆放着从小到大的圆盘:
- 每次只能移动一个圆盘
- 并且大圆盘不能在小圆盘之上
- 需要把这个柱子上的圆盘全部移动到另一根柱子上

问题抽象为,把a柱子上的N个圆盘按照顺序摆放到柱子c上:

这里写图片描述

1.2 问题解决

可以吧解决步骤抽象成:
1. 将N-1个圆盘从a移动到b
2. 把第N个圆盘从a移动到c
3. 把N-1个圆盘从b移动到c

1.3 代码实现

//n个圈从left移动到right
void hanNoTa(int n,char left,char right,char mid){
    if(n){
        hanNoTa(n-1,left,mid,right);// 将n-1个圈从left移动到mid
        cout<<"num: "<<n<<"  "<<left<<" to "<<right<<endl;//将第n个从left移动到right
        hanNoTa(n-1,mid,right,left);//将n-1个圈从mid移动到right
    }
}

二、改变规则

在原有规则的基础上,规定:
- 不能把圆盘从a直接移动到c
- 也不能把圆盘从c直接移动到a

2.1 解决方法

此时问题解决步骤为:
1. 将N-1个圆盘从a移动到c (这里是一个抽象概念,并不是直接移动)
2. 把第N个圆盘从a移动到b
3. 将N-1个圆盘从c移动到a
4. 把第N个圆盘从b移动到c
5. 将N-1个圆盘从a移动到c

2.2 代码表示

int i=0;//总共步数
void hannoi1(int n,char left,char right,char mid){
    if(n){
        hannoi1(n-1,left,right,mid);
        cout<<"num: "<<n<<"  "<<left<<" to "<<mid<<endl;
        i++;
        hannoi1(n-1, right, left, mid);
        cout<<"num: "<<n<<"  "<<mid<<" to "<<right<<endl;
        i++;
        hannoi1(n-1, left, right, mid);
    }
}

猜你喜欢

转载自blog.csdn.net/Zach_z/article/details/81319633
今日推荐