汉诺塔问题
**
**目的是从第一个柱子将所有盘子移动到第三个柱子,而在移动的过程中大的盘子不能放到小的盘子上面。
一共要移动
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;
}