汉诺塔的递归算法
什么是汉诺塔问题
这个问题来源于印度。有三个金刚石塔,第一个从小到大摞着64片黄金圆盘。现在把圆盘按大小顺序重新摆放在最后一个塔上。并且规定,在小圆盘上不能放大圆盘,在三个塔之间一次只能移动一个圆盘。
图解
当只有一个盘子时,就是直接将盘子从A放到C
两个盘子时:
- 将第一个从A放到B,C为辅助杆
- 将第二个从A放到C
- 将第一个从B放到C,A为辅助杆
n个盘子时:
可以将前n-1个盘子看成一个整体,这样就与两个盘子的情况相同。
- 将(n-1)个从A放到B,C为辅助杆
- 将第n个从A放到C
- 将(n-1)个从B放到C,A为辅助杆
代码
#include "stdafx.h"
#include "iostream"
using namespace std;
static int i = 0;//在外部定义一个变量用来表示第几次移动
void Move(int n, char sour, char des){//该方法用来实现盘子的移动
cout << "count" << ++i << " move" << n << " from " << sour << " to " << des << endl;
}
void Hanoi(int n,char A,char B,char C){
if (n==1)//当只有一个盘子时直接将它从A移动到C
{
Move(1, A, C);
}
else
{
Hanoi(n - 1, A, C, B);//递归调用,将(n-1)个从A放到B,C为辅助杆
Move(n, A, C);//将第n个从A放到C
Hanoi(n - 1, B, A, C);//递归调用,将(n-1)个从B放到C,A为辅助杆
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n = 3;
Hanoi(n, 'A', 'B', 'C');
return 0;
}
效果
n=3时: