汉诺塔(6种情况)
a–>c
#include<stdio.h>
#include<time.h>
void hanoi(int n,char a,char b,char c)//汉诺塔
{//把n个盘子从a柱移动到c柱
if(n>0)
{
hanoi(n-1,a,c,b);
printf("%c->%c\n",a,c);
hanoi(n-1,b,a,c);
}
}
int main()
{
int N=3,start,finish;
start=clock();
hanoi(N,'a','b','c');
finish=clock();
printf("用时:%dms\n",finish-start);
return 0;
}
a–>b
#include<stdio.h>
#include<time.h>
void hanoi(int n,char a,char b,char c)//汉诺塔
{//把n个盘子从a柱移动到b柱
if(n>0)
{
hanoi(n-1,a,c,b);
printf("%c->%c\n",a,b);
hanoi(n-1,c,b,a);
}
}
int main()
{
int N=3,start,finish;
start=clock();
hanoi(N,'a','b','c');
finish=clock();
printf("用时:%dms\n",finish-start);
return 0;
}
b–>a
#include<stdio.h>
#include<time.h>
void hanoi(int n,char a,char b,char c)//汉诺塔
{//把n个盘子从b柱移动到a柱
if(n>0)
{
hanoi(n-1,c,b,a);
printf("%c->%c\n",b,a);
hanoi(n-1,a,c,b);
}
}
int main()
{
int N=3,start,finish;
start=clock();
hanoi(N,'a','b','c');
finish=clock();
printf("用时:%dms\n",finish-start);
return 0;
}
b–>c
#include<stdio.h>
#include<time.h>
void hanoi(int n,char a,char b,char c)//汉诺塔
{//把n个盘子从b柱借助a柱移动到c柱
if(n>0)
{
hanoi(n-1,c,b,a);
printf("%c->%c\n",b,c);
hanoi(n-1,b,a,c);
}
}
int main()
{
int N=3,start,finish;
start=clock();
hanoi(N,'a','b','c');
finish=clock();
printf("用时:%dms\n",finish-start);
return 0;
}
c–>a
#include<stdio.h>
#include<time.h>
void hanoi(int n,char a,char b,char c)//汉诺塔
{//把n个盘子从c柱移动到a柱
if(n>0)
{
hanoi(n-1,b,a,c);
printf("%c->%c\n",c,a);
hanoi(n-1,a,c,b);
}
}
int main()
{
int N=3,start,finish;
start=clock();
hanoi(N,'a','b','c');
finish=clock();
printf("用时:%dms\n",finish-start);
return 0;
}
c–>b
#include<stdio.h>
#include<time.h>
void hanoi(int n,char a,char b,char c)//汉诺塔
{//把n个盘子从c柱移动到b柱
if(n>0)
{
hanoi(n-1,b,a,c);
printf("%c->%c\n",c,b);
hanoi(n-1,c,b,a);
}
}
int main()
{
int N=3,start,finish;
start=clock();
hanoi(N,'a','b','c');
finish=clock();
printf("用时:%dms\n",finish-start);
return 0;
}
也可以直接改输入,更简单
(hanoi(N,‘a’,‘b’,‘c’);//原始,辅助,目标)
函数里的方法已经确定了三个参数哪个是初始哪个是辅助哪个是目标,所以改一下传过去的实参就行了!
固定参数位置,改变传过去参数值;
函数里的abc是形参,传过去的’a’‘b’'c’是实参
拿b—>a的例子来说,就是输入按固定的位置开始,b借助c到a上,调用递归函数的时候,就是把问题分解为把每一层最大的依次放到a上,那么第一次的结果就是上边n-1个盘子会到c上,那么接下来就相当于从c借助b到a上,相当于又有一个新的(小规模)问题出现了。依次进行多次调用函数用这个规律就解决了
a->c就是先把最大的放到c,那么其他的都放到了b上,下一次的时候,就是b中最大的放到a上,剩余的都在c上,这样就转回来了。
其他的分析也都一样,就是问题变成了每一次都把最大的放在目标位置上。
附上b–>a的例子:
#include<stdio.h>
#include<time.h>
void hanoi(int n,char a,char b,char c)//汉诺塔
{//把n个盘子从b柱移动到a柱
if(n>0)
{
hanoi(n-1,a,c,b);
printf("%c->%c\n",a,c);
hanoi(n-1,b,a,c);
}
}
int main()
{
int N=3,start,finish;
start=clock();
hanoi(N,'b','c','a');
finish=clock();
printf("用时:%dms\n",finish-start);
return 0;
}
a借助c到b就是acb、b借助a到c就是bac、c借助b到a就是cba
其他几种都是类似,主要就是理解递归啦!