Hanoi问题递归求解
问题描述
设有三个分别命名为A,B,C的塔座,在塔座A上有n个直径各不相同,从小到大依次编号为1,2,3,…n的盘片,现要求将A塔座的n个盘片移到C塔座上并仍按同样顺序叠放,盘片移动必须遵循以下规则:
每次只能移动一个盘片;盘片可以放在任何一塔座;任何时候都不能将一个较大的盘片放在较小的盘片上。递归求解思想
欲将A上n个盘片通过B移动到C,可先将A上的n-1个盘片通过C移动到B塔座上,再将A上的第n个盘片移动到C上,最后将B塔座上的n-1个盘片通过A移动到C塔座上(思想不是很复杂,但不好理解!!!)。
举个栗子
假设此时的n=3(1,2,3号盘片)。
要想将3个盘片从A移动到C(Hanoi(3,A,B,C))①,先将A上较小的两个(1,2号)通过C(C此时为辅助塔座)从A–>B(Hanoi(2,A,C,B))②,再将3号从A–>C(move(n,A,C),3号最大已经归位),然后将B上的1,2号通过A(A此时为辅助塔座)移到C上就完成了(Hanoi(2,B,A,C))③。
此时再看②(Hanoi(2,A,C,B)),不难想象,要将两个盘片从A通过C到B,过程如下
③过程如下
Hanoi算法
void Hanoi (int n,char A,char B,char C)
{
if(n==1)cout<<"将第"<<n<<"个盘片从"<<A<<"移动到"<<"C"<<endl;
else
{
Hanoi(n-1,A,C,B);
cout<<"将第"<<n<<"个盘片从"<<A<<"移动到"<<"C"<<endl;//Move(),
Hanoi(n-1,B,A,C);
}
}