C++第13周项目3——汉诺塔

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565

【项目3-汉诺塔】
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,下面左图给出了移动方法的提示。请编制递归函数输出盘子数为4时(程序调试后,试试15个、20个,直至64个,看看会如何),移动的方案。下图为盘子数为3时的输出供参考。

#include <iostream>
using namespace std;
const int discCount=3;
void move(int, char, char,char);
int main()
{
	move(discCount,'A','B','C');
	return 0;
}

void move(int n, char A, char B,char C)
{
	if(n==1)
	{
		cout<<A<<"-->"<<C<<endl;
		return;
	}
	else
	{
		move(n-1,A,C,B);
		cout<<A<<"-->"<<C<<endl;
		move(n-1,B,A,C);
		return;
	}
}

【项目3扩展】如果要求出盘子移动的次数呢?请改写程序。
参考解答:

//仅计数
#include <iostream>
using namespace std;
const int discCount=3;
long move(int, char, char,char);
int main()
{
	long count;
	count=move(discCount,'A','B','C');
	cout<<discCount<<"个盘子需要移动"<<count<<"次。"<<endl;
	return 0;
}

long move(int n, char A, char B,char C)
{
	long c1,c2;
	if(n==1)
	{
		return 1;
	}
	else
	{
		c1=move(n-1,A,C,B);
		c2=move(n-1,B,A,C);
		return c1+c2+1;
	}
}

//输出且计数
#include <iostream>
using namespace std;
const int discCount=3;
long move(int, char, char,char);
int main()
{
	long count;
	count=move(discCount,'A','B','C');
	cout<<discCount<<"个盘子需要移动"<<count<<"次。"<<endl;
	return 0;
}

long move(int n, char A, char B,char C)
{
	long c1,c2;
	if(n==1)
	{
		cout<<A<<"-->"<<C<<endl;
		return 1;
	}
	else
	{
		c1=move(n-1,A,C,B);
		cout<<A<<"-->"<<C<<endl;
		c2=move(n-1,B,A,C);
		return c1+c2+1;
	}
}
时间: 2024-10-28 13:20:29

C++第13周项目3——汉诺塔的相关文章

2013级C++第13周项目——递归函数

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 第一部分 说三道四:计134,3班.4班编程大PK 按照课堂指示的座位,各组坐对位置: 按照指定的组号,创建用户:UserID形如:j1343XX或j1344XX,其中XX是组号,例(j134302和j134414),昵称写本组两名同学的姓名. 参考解答见:http://blog.csdn.net/sxhelijian/article/details/16800275,竞

C语言OJ项目参考(2021)汉诺塔

2021: 汉诺塔 Description 汉诺塔(又称河内塔)问题是印度的一个古老的传说.开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A.B和C,A上面套着n个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从A棒搬到C棒上,规定可利用中间的一根B棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面.僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就很搬了 聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗? Input 输入金片的

多柱汉诺塔最优算法设计探究

多柱汉诺塔最优算法设计探究   引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因此多柱汉诺塔的柱子个数M≥3.下面从三柱汉诺塔说起,慢慢深入我们要关心的问题. 1. 三柱汉诺塔 三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的典型问题.其算法是这样的: 首先把A 柱上面的n- 1 个碟子通过C 柱移到B 柱上[T(n-1)步],然后把A 柱剩下的一个碟子移到C 柱上[1步], 最后把B 柱上所有

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

java源码-java实现汉诺塔 求源码解析思路,不要链接

问题描述 java实现汉诺塔 求源码解析思路,不要链接 一共十六个盘子,盘子必须从小到大排列,只能在abc三个塔自由移动,一次只能移动一个!求源码 解决方案 这个要递推,假设开始的时候全部在a塔上,目标是全部移到c塔上. 从一个盘子开始: 1. 一个盘子,从a移到c塔显然只需要一步,所以答案是1 2.两个盘子,那么我们需要先将上面的一个盘子移到b塔,需要1步:再将a最下面的移到c塔上,需要1步:然后再将b塔的移到c塔上,需要1步:所以总计是3 3.三个盘子,那么我们需要先将上面两个移到b塔,按照

初学者c语言动态汉诺塔帮忙注释

问题描述 初学者c语言动态汉诺塔帮忙注释 #include #include #define N 1000 void gotoxy(int x, int y); // 声明gotoxy函数 void colorxy(int x, int y); //声明colorxy函数 void hanoi(int n,char a,char b,char c); //声明hanoi函数 void move(int n,char a,char b); //声明move函数 void Print(); //声明

c#汉诺塔的递归算法与解析_C#教程

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法. 至于递归,简单来说

乐在其中:无所不能用SQL挑战经典游戏汉诺塔

苏旭晖,网名 newkid ITPUB开发版资深版主,SQL开发专家 编辑手记:感谢苏旭晖先生授权我们独家转载其系列精品文章,也欢迎大家向"Oracle"社区投稿. SQL是一门非常灵活的语言,专家们用其挑战一切看似不可能. 问题来源 汉诺塔是源自印度神话里的玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.  大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个

汉诺塔 python版

汉诺塔问题:如果将n个盘子(由小到大)从a通过b,搬到c,搬运过程中不能出现小盘子在大盘子下面的情况. 思路分析:假设前要移动第100个盘子,分两步走,移动第99个:再移动第100个:而要移动第99个,同样分两部,移动第98个,再移动第99个,以此类推: if(n>1) { 1.先将A柱上的前n-1个盘子从A借助C移动到B; 2.把A柱子上的第n个盘子直接移动到C: 3.再将B柱子上的n-1个盘子借助A移动到C; } 1 #!/usr/bin/python 2 #encoding=utf-8 3