c++汉诺塔相关知识总结1

困扰已久,难以攻克的汉诺塔总结来啦

Part One 汉诺塔到底是什么呢?

汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。                        --引用维基百科

也就是说把圆盘从一个柱子,移动到另一个柱子,中途需要一个柱子来辅助完成,并且在这个过程中必须遵循“下大上小”的原则。

Part Two常见问题一:打印汉诺塔移动的步骤

那么这一类题应该怎么办呢?

接下来详解代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
int n,flag;
void move(int x,char A,char B,char C){//x就是代表这是从下往上数(从大往小)第x个圆盘
    if(x==0)
        return;//接下来开始想象你的面前有ABC,3个圆柱 其中第一个圆柱上放着x个圆盘,你想要把他们从第一个圆柱挪到第三个圆柱上
    move(x-1,A,C,B);//递归,这一句的意思相当于就是把当前圆盘上面的 x-1 这么一堆较小的圆盘 ,把他们从A挪到B(借助C柱)
    printf("%c->%c\n",A,C);//然后把它从A挪到C
    move(x-1,B,A,C);//现在A柱就空出来了,再把原来B上面x-1个圆盘挪到C(借助A)//那么这样子,x个圆盘就都挪到C啦@@@//有的时候看着这一堆ABC会发蒙//别慌,把每一次“集体大挪动”都看成是从A挪到C,和第一次x=n是=时的初衷一样;只需要在递归的过程中把ABC分别代表的柱子的字母记录下来,在递归过程中打印即可
}
int main()
{
    cin>>n;
    move(n,‘A‘,‘B‘,‘C‘);
    return 0;
}

哈哈,其实它也不难!

原文地址:https://www.cnblogs.com/Tidoblogs/p/11105040.html

时间: 2024-08-10 05:38:29

c++汉诺塔相关知识总结1的相关文章

012温习汉诺塔 (keep it up)

汉诺塔:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,应该怎么移动? 汉诺塔是个非常经典的问题,讲递归时应该都会讲到它.如果我们没有递归的先验知识, 直接去解答这道题,常常会觉得不知道如何下手.用递归却可以非常优美地解决这个问题. 使用递归的一个关键就是,我们先定义一个函数,不用急着去实现它, 但要明确它的功能. 对于汉诺塔问题,我们定义如下函数原型: void h

算法笔记_013:汉诺塔问题(Java递归法和非递归法)

目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus is possible for using animation. e.g. if n = 2 ; A→B ; A→C ; B→C; if n = 3; A→C ; A→B ; C→B ; A→C ; B→A ; B→C ; A→C; 翻译:模拟汉诺塔问题的移动规则:获得奖励的移动方法还是有可能的.

基于HTML5的WebGL设计汉诺塔3D游戏

在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. http://hightopo.com/demo/hanoi_20151106/index.html 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Tower_of_Hanoi. 知道了汉诺塔的规则和算法,现在就开始创建元素.用HT for Web(http://www.hightopo.com)现有的3D模板创建底盘和3根柱子不是问题,问题是要创建若

我对汉诺塔的理解

最近在复习C++相关的算法,而这之中就有汉诺塔,网上也看了很多信息,代码很简单,但是感觉原理没有讲透.我就想着我来分享我对汉诺塔的看法. 一.汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 该问题的百度百度百科链接:点击打开链接 二.代码思

Hanoi(汉诺塔问题)用栈来求解

学习c语言必定会遇到递归问题,学递归一定知道汉诺塔问题:如何将圆盘移动到另一根柱子上,但是圆盘的顺序不能改变. 有XYZ三个轴,n个盘子放在X轴上,目标是将N个盘子从X轴上移动到Z轴上 这里我们假设有这样一个方法F,F:将N个盘子按照原来的顺序从X轴上移动到Z轴上 如果只有一个盘子的话,一步到位 但是有N个(N>1)是,为了实现目标,我们需要利用中间轴来倒腾,我们将最后一个盘子上方的N-1个盘子按照顺序不变的方式(方法F)(这并不是移动步数最少的办法)先移动到Y轴,在将最后一个剩余的盘子移动到Z

HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)

在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Tower_of_Hanoi. 知道了汉诺塔的规则和算法,现在就开始创建元素.用HT for Web(http://www.hightopo.com)现有的3D模板创建底盘和3根柱子不是问题,问题是要创建若干个中空的圆盘.一开始的想法是:创建一个圆柱体,将圆柱体的上下两端隐藏,设置柱面的宽度来实现圆盘的效果

韩顺平_PHP程序员玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/ 课程说明:算法是程序的灵魂,为什么有些网站能够在高并发,和海量吞吐情况下依然坚如磐石,大家可能会说: 网站使用了服务器集群技术.数据库读写分离和缓存技术(比如memcahced和redis等),那如果我再深入的问一句,这些优化技术又是怎样被那些天才的技术高手设计出来的呢? 我在上大学的时候就在想,究竟是什么让不同的人写出的代码从功能看是一样的,但从运行效率上却有天壤之别, 就拿以前在软件公司工作的实际经历来说吧, 我是

[算法]——汉诺塔的递归深度

今天早晨在上班的路上,一好朋友突然提到之前的一个计算机的考题,汉诺塔(相信大家都玩过)的递归深度. 由于很久没有看算法,以及脑容量有限,当时没有多想. 来到公司后,把公式列了一下,终于清晰多了. 下面假设3根柱子编号为1,2,3. 主要思路: 把n个圆盘从3号移到1号 = 把n-1个圆盘从3号移到2号 + 把第n个圆盘从3号移到1号 + n-1个圆盘从2号移到1号 列出公式: f(n) = f(n-1) + 1 + f(n-1) = 2f(n-1) + 1 计算公式: 接下来就是数学题了, 利用

汉诺塔递归函数少个参数怎么办?

汉诺塔问题,大一学数据结构的时候就接触了. 今天遇到一个作业,作业要求给定了递归函数的定义: public class Tower { private int ndisks; private ArrayList<TowerMove> result = new ArrayList<>(); public Tower(int ndisks) { this.ndisks = ndisks; } public ArrayList<TowerMove> solveTower(St