1.问题描述:
起初有64个金盘串在一个木桩上,从下到上尺寸逐步缩小。需要按照一次只能移动一个金盘并且大的金盘永远不能放在小的金盘上的规定,将这叠金盘移动到另一个木柱上。总共三个木柱,一个用于暂放金盘。
2.问题分析:
三根柱子A,B,C,一根目标柱C,一叠盘子。
(1)将n-1个盘子从A柱移动至B柱;
(2)将A柱的最后一个盘子放到C柱;
(3)将n-1个盘子从B柱移动到C柱.
递归解法思路:
(1)n=1时,直接将盘子从A柱移动至C柱;
(2)n>=2时,先将n-1个盘子从A柱借助C柱移动到B柱,然后将第n个盘子从A柱直接移动到C柱,最后将n-1个盘子从B柱借助A柱移动到C柱。
3.三种不同表达方式的程序代码:
#include <iostream>
using namespace std;
//x是初始柱,z是目标柱.
void Hanoi(int n,char x,char y,char z)
{
if(n==1)
cout << x << "---->" << z << endl;
else
{
Hanoi(n-1,x,z,y);//将n-1个盘子从x经由z移动到y
cout << x << "---->" << z << endl;//将第n个盘子移动到z
Hanoi(n-1,y,x,z);//将y上的盘子经由x移动到z
}
}
int main()
{
int n;
cout << "请输入盘子的数目:"<< endl;
cin >> n;
Hanoi(n,'A','B','C');
return 0;
}
#include <stdio.h>
//第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔
//记录步数
int i=1;
//将编号为n的盘子由a移动到b
void move(int n,char a,char b);
//将n个盘子由初始塔移动到目标塔(利用借用塔)
void hanoi(int n,char a,char b,char c);
int main()
{
printf("请输入盘子的个数:\n");
int n;
scanf("%d",&n);
char x='A',y='B',z='C';
printf("盘子移动情况如下:\n");
hanoi(n,x,y,z);
return 0;
}
void move(int n,char a,char b){
printf("第%d步:将%d号盘子%c---->%c\n",i++,n,a,b);
}
void hanoi(int n,char a,char b,char c){
if (n==1)
move(1,a,c);
else
{
hanoi(n-1,a,c,b);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
move(n,a,c);//将剩下的一个盘子移动到目的塔上
hanoi(n-1,b,a,c);//最后将借用塔上的n-1个盘子移动到目的塔上
}
}