汉诺塔问题

基本思路


不要试图用脑子跟踪递归的每一步,就是应为脑子跟不过来才用的递归思想


N 个盘子从A 座移到C 座可以分解为以下三个步骤:

  1. AN-1 个盘借助C 座县移到B 座上;
  2. A 座上剩下的一个盘移到C 座上;
  3. N-1 个盘从B 座借助于A 座移到C 座上。

上面第1步与第3步的操作相似,因此可以将上面3个步骤分为两类操作

  • N-1 个盘子从一个座移到另一个座(N>1 )。
  • 1 个盘子从一个座移到另一个座上。

代码如下

#include <stdio.h>

void move(char x,char y)//move函数
{
	printf("%c--->%c\n",x,y);
}//move

void hanoi(int n,char one,char two, char three)//hanoi函数
{//将n个盘借从one座借助two座,移到three座
	if(n==1) move(one,three);
	else
	{
		hanoi(n-1,one,three,two);
		move(one,three);
		hanoi(n-1,two,one,three);
	}
}//hanoi

int main()
{
	int n;
	scanf("%d",&n);
	hanoi(n,'A','B','C');
	return 0;
}//main
posted @ 2019-03-14 17:13  DismalSnail  阅读(166)  评论(0编辑  收藏  举报