问题:
三根柱子A,B,C.其中A上有n个直径递增的圆盘(最顶为最小,然后往下一次增大),现在要把A上的n个圆盘移到C上,要求每次移动一个,不允许出现任何大的圆盘叠放在小的圆盘上,柱B可作中转用。求移动步骤。
这个问题使用递归思想是比较靠谱的,能大大降低难度。c语言代码如下:
// Created by zyb on 14-6-23.
// All rights reserved.
#include <stdio.h>
void m(int n,char x,char y,char z);//声明函数m,函数的四个参数中,n代表汉诺塔的层数,x、y、z代表从将n层汉诺塔从x移动到z,y为中间介质。
void m(int n,char x,char y,char z){
if (n==1) { //如果只有一个需要移动,直接输出
printf(“%c–>%c\n”,x,z);
}
else{ //如果有n>1个需要从x移动z,将x最上面的n-1个移动到y,将最后一个移动到z,最后利用递归。将y上面的n-1个移动到z。
m(n-1,x, z, y);
printf(“%c–>%c\n”,x,z);
m(n-1, y,x,z);
}
}
int main(){
int n=0;
printf(“请输入汉诺塔的层数:”);
scanf(“%d”,&n);
m(n, ‘A’, ‘B’, ‘C’);
}
运行,输入6,结果如下:
请输入汉诺塔的层数:6
A–>B
A–>C
B–>C
A–>B
C–>A
C–>B
A–>B
A–>C
B–>C
B–>A
C–>A
B–>C
A–>B
A–>C
B–>C
A–>B
C–>A
C–>B
A–>B
C–>A
B–>C
B–>A
C–>A
C–>B
A–>B
A–>C
B–>C
A–>B
C–>A
C–>B
A–>B
A–>C
B–>C
B–>A
C–>A
B–>C
A–>B
A–>C
B–>C
B–>A
C–>A
C–>B
A–>B
C–>A
B–>C
B–>A
C–>A
B–>C
A–>B
A–>C
B–>C
A–>B
C–>A
C–>B
A–>B
A–>C
B–>C
B–>A
C–>A
B–>C
A–>B
A–>C
B–>C