数组模拟汉诺塔问题

#include<stdio.h>

int step=0;   //全局变量step用于统计步数

int main()
{
	
	int left[5]={1,2,3,4,5};
	int mid[5]={0},right[5]={0};      //用三个数组模拟三个柱子,5个数字表示由大到小的5个盘子
	int steps;
	int hanoi_com(int n,int a[5],int b[5],int c[5]);

	steps=hanoi_com(5,left,mid,right,0);

	printf("left=[%d,%d,%d,%d,%d]\n",left[0],left[1],left[2],left[3],left[4]);
	printf("mid=[%d,%d,%d,%d,%d]\n",mid[0],mid[1],mid[2],mid[3],mid[4]);
	printf("right=[%d,%d,%d,%d,%d]\n",right[0],right[1],right[2],right[3],right[4]);    //打印最终状态
	
	printf("steps=%d\n",steps);    //打印结果

	return 0;
}

int hanoi_com(int n,int a[5],int b[5],int c[5])
{
	int i,aofe_a,aofe_c;

	if(n==1)
	{
		i=0;
		while(i<=4)
		{
			if(a[i]!=0) break;
			else i++;
		}
		aofe_a=i;        //统计柱子a的空位数

		i=0;
		while(i<=4)
		{
			if(c[i]!=0) break;
			else i++;
		}
		aofe_c=i;        //统计柱子c的空位数

		c[aofe_c-1]=a[aofe_a];
		step=step+1;
		a[aofe_a]=0;     //进行一次变换并记录
	}

	//三步法
	else
	{
		hanoi_com(n-1,a,c,b);

		i=0;
		while(i<=4)
		{
			if(a[i]!=0) break;
			else i++;
		}
		aofe_a=i;

		i=0;
		while(i<=4)
		{
			if(c[i]!=0) break;
			else i++;
		}
		aofe_c=i;

		c[aofe_c-1]=a[aofe_a];
		step=step+1;
		a[aofe_a]=0;
		
		hanoi_com(n-1,b,a,c);
	}
	return step;
}
经典汉诺塔问题通过简单的递归法计算完成步数,本文以5个盘子为例,用数组模拟汉诺塔问题实现的过程(c语言实现),思想还是传统的“三步法”。 

以上代码经过加工后还可实现对每一次变换的显示,本文暂不贴出,如感兴趣可自己尝试。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值