漢諾塔問題

漢諾塔問題

**這裏寫圖片描述


**目的是從第一個柱子將所有盤子移動到第三個柱子,而在移動的過程中大的盤子不能放到小的盤子上面。
一共要移動
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章