汉诺塔(6种情况)

汉诺塔(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

其他几种都是类似,主要就是理解递归啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值