漢諾塔算法詳解之C++


漢諾塔:

有三根桿子A,B,C。A桿上有N個(N>1)穿孔圓環,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C桿:

  1. 每次只能移動一個圓盤;
  2. 大盤不能疊在小盤上面。

提示:可將圓盤臨時置於B桿,也可將從A桿移出的圓盤重新移回A桿,但都必須遵循上述兩條規則。

問:如何移?最少要移動多少次?

為了解決這個問題,不妨假設已經知道怎樣移動N-1個圓環了。現在,為了把起點盤上的圓環移動到目標盤,需要做如下操作:

1、把N-1個圓環從起點盤移動到(當前)沒有任何圓環的過度盤;

2、把最后一個圓環從起點盤移動到目標盤;

3、把N-1個圓環從國度盤移動到目標盤(模仿1和2的操作方法來實現)。

參考圖:

三個圓盤的漢諾塔 

四個圓盤的漢塔:

C++實現漢諾塔算法的程序:

#include <iostream>
#include <cstdio>

using namespace std;
 
void hannoi (int n, char A, char B, char C)  // 把A盤里面的圓圈轉移到C盤里面【A--C】。
{
    if (n == 1)
    {
        cout << "移動圓圈" << n << "從盤" << A << "" << C << endl;  //把最后一個圓環從起點盤移動到目標盤。
    }
    else
    {
        hannoi (n-1, A, C, B);  // 把N-1個圓環從起點盤移動到(當前)沒有任何圓環的過度盤;通過B、C盤在此函數調用中調用位置的互換,來實現把N-1個圓環從A盤到B盤的轉移【A--B】。
        cout << "移動圓圈" << n << "從盤" << A << "" << C << endl;
        hannoi (n-1, B, A, C);  // 把N-1個圓環從國度盤移動到目標盤(模仿1和2的操作方法來實現);通過A、B盤在此函數調用中位置的互換,來實現N-1個圓環從B盤到C盤的轉移【B--C】。
    }
}
 
int main()
{
    int n;
    cin >> n;
hannoi (n,
'a', 'b', 'c');
system(
"pause"); return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM