题目
假设有三个分别命名为X,Y,Z的灯塔,在X上有n个直径大小不同,以小到大编号1,2,...,n的圆盘。现要求将X上的n个圆盘移动到Z上并按照同样的次序堆叠排列,移动时必须遵守以下三点:
(1)每次只能移动一格圆盘
(2)圆盘可以放置在X,Y,Z任一塔上
(3)任何情况下都不能将大圆盘放到小圆盘上面
解法
如果n=1,则这个圆盘直接从X移动到Z,否则执行以下步骤:
(1)用Z做中继,将X上的(n-1)个圆盘移动到Y上
(2)将X上的最后一个圆盘直接移动到Z上
(3)把X做中继,将Y轴上的(n-1)个圆盘移动到Z上
此时,通过重复以上步骤即可完成,对于术式表示如下:
//将塔X上按大小由小到大且自上而下,编号为1到n个圆盘搬到Z上
//其中Y作为辅助
void hanoi(int n,char x, char y,char z){
//起始判断
if(n==1){
move(x,1,z);//将编号为1的圆盘从X移动到Z
i++;
}
else{
hanoi(n-1,x,z,y);//将X上编号为1到n-1的圆盘移动到Y,Z作为辅助
move(x,n,z);//将编号为n的圆盘从X移到Z
i++;//
hanoi(n-1,y,x,z);将Y上编号为1到n-1的圆盘移到Z,X作为辅助
}
}
思路设计及延伸
首先要理解在计算机中的实现:调用函数与被调用函数之间的链接和信息交换必须通过栈进行,当一个函数运行期间调用另一个函数时,在运行该被调用函数之前,需要先完成以下的事情:
1.将所有的实际参数、返回地址等信息传递给被调用函数保存(形象的称为“保存现场”,以便需要时“恢复现场”返回到某一状态)
2.为被调用函数的局部变量分配储存空间
3.将控制转移到被调用函数的入口
从被调用函数返回调用函数之前,应完成以下:
1.保存被调用函数的计算结果
2.释放被调用函数的数据区
3.依照被调用函数保存的返回地址将控制转移到调用函数
对于多个函数嵌套的调用的规则是:后调用的先返回,此时内存管理实行“栈式管理”
对于hanoi(3,X,Y,Z)注意以下的变化情况:
1.
hanoi(2,X,Z,Y);
hanoi(1,X,Y,Z);move(X,1,Z);一号盘移到Z
move(X,2,Y);二号盘移动到Y
hanoi(1,Z,X,Y);move(Z,1,Y);一号盘移到Y
2.
move(X,3,Z);三号盘移动到Z
3.
hanoi(2,Y,X,Z);
hanoi(1,Y,Z,X);move(Y,1,X);一号盘移到X
move(Y,2,Z);二号盘移到Z
hanoi(1,X,Y,Z);move(X,1,Y);一号盘移到C
//以上-1.21
//完整算法有时间再写XD-1.21