漢諾塔問題
**
**目的是從第一個柱子將所有盤子移動到第三個柱子,而在移動的過程中大的盤子不能放到小的盤子上面。
一共要移動
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;
}