汉诺塔问题

汉诺塔问题

**这里写图片描述


**目的是从第一个柱子将所有盘子移动到第三个柱子,而在移动的过程中大的盘子不能放到小的盘子上面。
一共要移动
f(n) = 2*f(n) + 1 次
思路:
典型的迭代方法,在一次迭代中,、
首先,将n-1个盘子由A柱借助C柱移动到B柱。
然后,将第n个盘子由A柱移动到C柱。
最后,将n-1个盘子由B柱通过A柱移动到C柱
反复迭代。**

代码块

代码块语法遵循标准markdown代码,例如:

#include<iostream>  
using namespace std;
int main()
{
    void hanoi(int n, char one, char two, char three);
    int num;
    cout << "请输入需要移动的盘子数目:" << endl;
    cin >> num;
    int val(int);   //函数声明   

    if (num == 0){
        cout << "输入的数字必须大于0!" << endl;
        return -1;
    }
    else
        cout << "需要" << val(num) << "次" << endl;

    hanoi(num, 'A', 'B', 'C');
}


void hanoi(int n, char one, char two, char three)
{
    void print(char x, char y);
    if (n == 1)
    {
        print(one, three);
    }
    else
    {
        hanoi(n - 1, one, three, two);//将n-1个盘子从    A借助C到B上
        print(one, three);   //  将弟n个盘子从A移动到C上
        hanoi(n - 1, two, one, three); //将n-1个盘子从B借助A到Z上
    }

}
void print(char x, char y)
{
    cout << x << "-->" << y << endl;
}
int val(int n){
    int c;
    if (n == 1) c = 1;
    else c = 2 * val(n - 1) + 1;
    return c;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章