`
_jia_shun
  • 浏览: 27280 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

习题6_42汉诺塔问题

 
阅读更多
//汉诺塔问题
//1、2、3共三个直杆,初始时有NUMBER个盘子按照从大到小的顺序
//在1上从底向上摆放,要求将这些盘子按照次序摆放到3杆
//比如1->2表示将1上的最上面一个盘子放到2上,

//汉诺塔问题是2的n次幂级别的时间复杂度啊

//下面给出的是利用六个函数相互之间直接或者间接递归,
//如何利用一个包含有四个参数的函数实现递归???
#include <iostream>
#define NUMBER 5
using namespace std;

void H1to2(int);//将1上的所有盘子按照从大到小自底向上的顺序放到2上
void H1to3(int);//将1上的所有盘子按照从大到小自底向上的顺序放到3上
void H2to1(int);//将2上的所有盘子按照从大到小自底向上的顺序放到1上
void H2to3(int);//将2上的所有盘子按照从大到小自底向上的顺序放到3上
void H3to1(int);//将3上的所有盘子按照从大到小自底向上的顺序放到1上
void H3to2(int);//将3上的所有盘子按照从大到小自底向上的顺序放到2上

int count = 0;//记录盘子转移的次数

int main()
{
	cout << NUMBER << "个盘子的汉诺塔问题解决方法如下:" << endl;
	H1to3(NUMBER);
	cout << "转移盘子的次数为:" << count << endl;
	system("pause >> cout");
	return 0;
}

//将1上的所有盘子按照从大到小自底向上的顺序放到2上
void H1to2(int n1to2)
{
	if(n1to2 == 1)
	{
		cout << " 1 -> 2 " << endl;
		count++;
	}
	else 
	{
		H1to3(n1to2-1);
		H1to2(1);
		H3to2(n1to2-1);
	}
}

//将1上的所有盘子按照从大到小自底向上的顺序放到3上
void H1to3(int n1to3)
{
	if(n1to3 == 1)
	{
		cout << " 1 -> 3 " << endl;
		count++;
	}
	else
	{
		H1to2(n1to3 - 1);
		H1to3(1);
		H2to3(n1to3 - 1);
	}
}

//将2上的所有盘子按照从大到小自底向上的顺序放到1上
void H2to1(int n2to1)
{
	if(n2to1 == 1)
	{
		cout << " 2 -> 1 " << endl;
		count++;
	}
	else
	{
		H2to3(n2to1 - 1);
		H2to1(1);
		H3to1(n2to1 - 1);
	}
}

//将2上的所有盘子按照从大到小自底向上的顺序放到3上
void H2to3(int n2to3)
{
	if(n2to3 == 1)
	{
		cout << " 2 -> 3 " << endl;
		count++;
	}
	else
	{
		H2to1(n2to3 - 1);
		H2to3(1);
		H1to3(n2to3 - 1);
	}
}

//将3上的所有盘子按照从大到小自底向上的顺序放到1上
void H3to1(int n3to1)
{
	if(n3to1 == 1)
	{
		cout << " 3 -> 1 " << endl;
		count++;
	}
	else
	{
		H3to2(n3to1 - 1);
		H3to1(1);
		H2to1(n3to1 - 1);
	}
}

//将3上的所有盘子按照从大到小自底向上的顺序放到2上
void H3to2(int n3to2)
{
	if(n3to2 == 1)
	{
		cout << " 3 -> 2 " << endl;
		count++;
	}
	else
	{
		H3to1(n3to2 - 1);
		H3to2(1);
		H1to2(n3to2 - 1);
	}
}

 这上面的就是渣呀,怎么会有这种奇葩的思维

#include <iostream>
using namespace std;

/*递归函数
   从左到右的参数分别为准备移动的盘子数,最初放置这些盘子的桩
   作为临时存放点的桩,最终放置这些盘子的桩*/
void hanoi(int ,char ,char ,char);

int count;//统计进行多少次的转移
int main()
{
	int number;//盘子个数
	cout << "请输入汉诺塔问题中的盘子个数:";
	cin >> number;
	hanoi(number,'A','B','C');
	system("pause >> cout");
	return 0;
}


//将number个盘子从a桩借助b桩转移到c桩
void hanoi(int number,char a,char b,char c)
{
	if(number == 1)
		cout << a << " -> " << c << endl;
	else
	{
		hanoi(number-1,a,c,b);
		cout << a << " -> " << c << endl;
		hanoi(number-1,b,a,c);
	}
}

 

分享到:
评论

相关推荐

    Hanoi Tower 汉诺塔问题/c

    汉诺塔问题是一个经典的递归问题,在计算机科学和数学领域都有着广泛的应用。它不仅是一个编程练习题,也是理解递归思想和分治策略的一个很好例子。 首先,我们来了解汉诺塔问题的基本概念。汉诺塔(Hanoi Tower)...

    汉诺塔.js 实现过程

    js手写实现汉诺塔和移动过程和控制台树形结构

    汉诺塔(C语言)

    C语言习题 递归方法求解汉诺塔问题 C语言习题 递归方法求解汉诺塔问题

    四柱汉诺塔代码(c++)

    四柱汉诺塔问题是一个经典的递归算法问题,源自古代印度的一个传说,它涉及三个柱子和若干个大小不一的圆盘。在这个问题中,目标是将所有圆盘从一个柱子移动到另一个柱子,但每次只能移动一个盘子,并且任何时候大...

    人工智能方法求解汉诺塔

    汉诺塔问题是一个经典的递归问题,源自印度的古老传说,它涉及到三个柱子和一堆大小不一的圆盘。目标是将所有圆盘从一个柱子(初始柱)移动到另一个柱子(目标柱),但每次只能移动一个圆盘,并且任何时候大盘子都不...

    汉诺塔问题,C语言实现

    汉诺塔问题代码,包括栈的基本操作,思路清晰,对于初学者有很好的指导作用。数据结构上机题目的代码,大学二年级的资料

    关于汉诺塔的问题c++

    汉诺塔问题是一个经典的递归问题,源自印度的古老传说,它涉及到三个柱子和一组大小不一的圆盘。游戏的目标是将所有圆盘从第一个柱子(A)移动到第三个柱子(C),每次只能移动一个圆盘,并且任何时候大盘子都不能...

    hdu 汉诺塔

    题目中的“ACM HDU 汉诺塔 递归练习”指的是在中国杭州电子科技大学(ACM HDU)在线评测系统上的一系列关于汉诺塔问题的练习题。 #### 汉诺塔问题背景 汉诺塔问题源于一个古老的印度传说,据说在世界的中心贝拿勒斯...

    java 经典习题 【八皇后,汉诺塔等】

    【标题】"java 经典习题 【八皇后,汉诺塔等】" 【描述】中的这个主题聚焦在Java编程语言的经典问题上,这些问题通常被用作面试或学习编程思维的练习。这些习题涵盖了算法设计、问题解决策略以及数据结构的运用。...

    C语言基础算法习题集 包括青蛙跳台阶 汉诺塔等分享给需要的同学

    C语言基础算法习题集 包括青蛙跳台阶 汉诺塔等分享给需要的同学 C Basic Algorithms Problem sets Introduction Here collect a set of Problems which about Algorithms, which are suitable for tyros to Practice...

    Hanoi塔问题的一种非递归算法

    ### Hanoi塔问题的一种非递归算法:深入解析与实现 #### 一、引言 Hanoi塔问题作为计算机科学领域内经典的递归问题之一,因其简洁性和挑战性而广受关注。通常,Hanoi塔问题的解决方案多采用递归算法,尽管其逻辑...

    python实现汉诺塔算法

    同时,对于初学者来说,汉诺塔问题也是学习递归思想非常好的练习题。 总之,本文通过一个具体的编程实例——Python实现汉诺塔算法,深入浅出地讲解了递归算法在解决实际问题中的应用,并给出了一段完整的示例代码。...

    汉诺塔java源码-DataStructuresAlgorithms:500+数据结构和算法练习题

    本资源“汉诺塔Java源码-DataStructuresAlgorithms:500+数据结构和算法练习题”提供了一个丰富的实践平台,涵盖了500多个数据结构和算法的实例,旨在帮助开发者深入理解和应用这些基础知识。 首先,让我们关注汉诺...

    C++ 大学教程 Deitel第五版 课后习题第六章

    在本节中,我们将深入探讨"C++大学教程Deitel第五版"中第六章的课后习题,重点是递归程序设计以及著名的汉诺塔(Hanoi)问题。递归是计算机科学中的一个重要概念,它涉及到函数调用自身来解决更小规模的同类问题。而...

    浙大计算机能力测试练习题PAT 1073 1076

    或者,题目可能与递归有关,如斐波那契数列、汉诺塔等问题。 最后,题目1076可能测试的是C++高级特性,如模板、虚函数、多态、异常处理等。也可能涉及一些高级算法,如KMP字符串匹配算法、二分查找、滑动窗口最大值...

    JAVA基础编程练习题50题及经典算法90题【含源码及答案】-史上最全

    8. **递归与递推**:阶乘计算、汉诺塔问题、斐波那契数列等。 在解决这些题目时,学习者应深入理解每个知识点背后的原理,并通过实践来提高编程技巧。源码与答案的提供有助于自我检查和学习,可以及时发现错误,...

    练习题练习题lianxit

    通常,汉诺塔问题是一个经典的递归算法问题,涉及将多层圆盘从一根柱子移动到另一根柱子,遵循每次只能移动一个圆盘且大圆盘不能放在小圆盘之上的规则。但这个话题并未在题目描述或部分内容中体现,因此不在当前内容...

    算法初步练习题.rar

    通过《算法初步练习题》中的习题,你可以系统地练习和掌握这些基础算法,从而提升自己的编程能力和问题解决能力。解题过程中,建议配合理论学习,理解每种算法的原理,并尝试用不同的语言实现,以加深理解。同时,...

    蓝桥杯java习题.doc

    在汉诺塔问题中,我们可以使用递归来解决问题,或者使用动态规划来解决问题。 知识点8:算法优化 算法优化是一种重要的技术,它可以提高程序的效率和性能。在解决汉诺塔问题和海盗船长问题时,我们可以使用算法...

Global site tag (gtag.js) - Google Analytics