码迷,mamicode.com
首页 > 其他好文 > 详细

汉诺塔问题

时间:2015-04-11 16:25:52      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:汉诺塔经典问题

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n),并计算出移动的方式

这是一个典型的递归问题,我们可以借助其中的一个柱子辅助移动,规定:A初始为N个盘子,移动的目标是C,我们可以现将N-1个借助C移动到B中,然后将第N个盘子移动到C中,最后将B上的N-1个盘子借助A移动到C中


#include <stdio.h>

void hannuota(int disk_count, char pillar_1,char pillar_2,char pillar_3)
{
	if(disk_count==1)
		printf("\n将编号为%d 的盘子 从 %c 柱子移动到 %c柱子",disk_count,pillar_1,pillar_3);
	else
	{
		hannuota(disk_count-1,pillar_1,pillar_3,pillar_2);
		printf("\n将编号为%d 的盘子 从 %c 柱子移动到 %c柱子",disk_count,pillar_1,pillar_3);
		hannuota(disk_count-1,pillar_2,pillar_1,pillar_3);
	}
}
int main(int argc, char** argv)
{
	int n;
	char pillar_1='A',pillar_2='B',pillar_3='C';
	scanf("%d",&n);
	hannuota(n,pillar_1,pillar_2,pillar_3);
	return 0;
}


汉诺塔问题

标签:汉诺塔经典问题

原文地址:http://blog.csdn.net/u011889952/article/details/44995287

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!