汉诺塔
时间限制: 1 Sec 内存限制: 128 MB题目描述
有n个圆盘,半径各不相同,依半径从大到小,自下而上套在A柱上,另还有B、C两根空柱,现要求将A柱上的n个圆盘全部搬到C柱上去且每次只许搬动一个盘子,还必须始终保持每根柱子上是小盘在上,大盘在下。编一个程序能够打印出移动过程。
输入
一个整数n,代表盘子数
输出
输出每一步移动过程,如:
Move disk 1 from A to C
样例输入
3
样例输出
Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C
点击打开链接
明显用递归;
n==1时,直接从A移动到C;
n==2时,先把1从A移到B,再把2从A移到C,最后把1从B移到C;
n==n时,先把n-1(借助A)从A移到B,再把n从A移到C,然后把n-1珠(借助A)从B移到C,
#include
using namespace std;
void output(int n,char a,char b)
{
printf("Move disk %d from %c to %c\n",n,a,b);
}
void hanoi(int n,char a,char b,char c)
{
if(n==1)
output(n,a,c);
else
{
hanoi(n-1,a,c,b);
output(n,a,c);
hanoi(n-1,b,a,c);
}
}
int main()
{
int n;
char a,b,c;
printf("请输入塔的个数:");
scanf("%d",&n);
hanoi(n,'A','B','C'); //注意是字符要加单引号
return 0;
}
#include
using namespace std;
void output(int n,char a,char b)
{
printf("Move disk %d from %c to %c\n",n,a,b);
}
void hanoi(int n,char a,char b,char c)
{
if(n==1)
output(n,a,c);
else
{
hanoi(n-1,a,c,b);
output(n,a,c);
hanoi(n-1,b,a,c);
}
}
int main()
{
int n;
char a,b,c;
printf("请输入塔的个数:");
scanf("%d",&n);
hanoi(n,'A','B','C'); //注意是字符要加单引号
return 0;
}