汉诺塔问题求解

汉诺塔问题求解

在这里插入图片描述

  • 第一次移动,把A柱子上的前n-1个移动到B柱子上,借助C柱
  • 第二次移动,直接把A柱子上的最后一个移动到C柱子上
  • 第三次移动,把B柱子上的n-1个柱子通过柱子A移动到柱子C上

此题要通过递归,而递归的主要思想就是化繁为简,比如:移动3个盘子就相当于移动两个盘子,再移动一个盘子,移动4个盘子就相当于移动三个盘子,而移动3个盘子就又回到了前面.这其实就是递归的思想.

递归两个根本条件

  1. 要有结束条件
  2. 每次递归后要能逐渐逼近这个结束条件

对比汉诺塔

  1. 结束条件=将A柱上所有盘子都移到C柱上
  2. 逼近结束条件=将A借助B移到C,将B借助A移动到C,一句话,就是每次都从A-C,每次都在不断接近(就是每次移动一个盘子)

实际上只需要跟着这三次移动,写出相应的代码即可.

#include<stdio.h>



int count=0;//全局变量算总移动次数

//只从起始处移到目的地 
void Move(int plates_num, char start, char end)
{
    count++;
    printf("The %dst Move: %c -> %c\n",count,start,end);
}

void get_Hanoi(char start,char tool,char end,int plates_num)
{
	if(plates_num==1)//如果只有一个盘子要移动,那么直接放到C柱 
	{
		Move(plates_num,start,end);
	}
	else
	{
		get_Hanoi('a','c','b',plates_num-1);//第一次移动,把A柱子上的前n-1个移动到B柱子上,借助C柱 
		Move(plates_num,'a','c');//第二次移动,A移到C 
		get_Hanoi('b','a','c',plates_num-1);//第三次移动,把B柱子上的前n-1个移动到C柱子上,借助A柱 
	}
}

void main()
{
	int plates_num;
	
	printf("plates=");
	scanf("%d",&plates_num);
	
	get_Hanoi('a','b','c',plates_num);
}

我觉得其实很多人被绕进去是因为自己定义的变量名.如果你起点简单移动的变量名,对吧,就要好理解的多.

  																							如有问题,欢迎指正
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值