有n个大小不等的中空圆盘,按照从小到大的顺序迭套在立柱A上,另有两根立柱B和C。现要求把全部圆盘从A柱(源柱)移到C柱(目标柱),移动过程中可借助B柱(中间柱)。移动时有如下的要求:
①一次只移动一个盘;
②不允许把大盘放在小盘上边;
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
递归时间为:4ms
5
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
A--->B
C--->B
C--->A
B--->A
C--->B
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
B--->A
C--->B
C--->A
B--->A
B--->C
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
递归时间为:79ms
①一次只移动一个盘;
②不允许把大盘放在小盘上边;
③可使用任意一根立柱暂存圆盘。
首先将A柱上方的n-1个盘子从A柱移到B柱,此过程中C柱为中间柱;
然后将A柱省下的一个盘子移到C柱;
最后再将B柱上的n-1个盘子移到C柱,此过程中A柱为中间柱,这就变成了移动n-1个盘子的问题了。
若 n = 1,则A-->C
若 n >= 2,则
hanoi(n-1,A,C,B)
A-->C
hanoi(n-1,B,A,C)
#include<stdio.h>
#include<time.h>
void move(char x,char y)
{
printf("%c--->%c\n",x,y);
}
void hanno(int n,char one,char two,char three)
{
// void move(char x,char y);
if(n==1)
move(one,three);
else
{
hanno(n-1,one,three,two);//第n-1个要从one通过three移动到two
move(one,three);
hanno(n-1,two,one,three);
}
}
int main()
{
long op,ed;
int m;
while(scanf("%d",&m)!=EOF)
{
op=clock();
hanno(m,'A','B','C');
ed=clock();
printf("递归时间为:%ldms\n",ed-op);
}
}
3
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
递归时间为:4ms
5
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
A--->B
C--->B
C--->A
B--->A
C--->B
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
B--->A
C--->B
C--->A
B--->A
B--->C
A--->C
A--->B
C--->B
A--->C
B--->A
B--->C
A--->C
递归时间为:79ms
10 递归时间为:735ms
15 递归时间为:7375ms