汉诺塔(代码记录+注释)

//汉诺塔问题
//输出移动的步骤
#include <stdio.h>
//记录步数
int i = 1;
//n 第几号盘移动, from 移动塔  to 目标塔
void move(int n, char from,char to){
    printf("第%d次移动第%d号盘: %c----->%c\n",i++,n,from,to);
} 

void hanoi(int n,char from,char mid,char to){
    if(n==1){
        move(n,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地
    }else{
        hanoi(n-1,from, to, mid);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
        move(n,from,to);        //将剩下的一个盘子移动到目的塔上
        hanoi(n-1,mid, from,to);//最后将借用塔上的n-1个盘子移动到目的塔上
    }
}

int main(){
    printf("请输入盘子的个数:\n");
    int n;
    scanf("%d",&n);
    char x=‘A‘,y=‘B‘,z=‘C‘;
    printf("盘子移动情况如下:\n");
    hanoi(n,x,y,z);
    return 0 ;
} 

原文地址:https://www.cnblogs.com/0526yao/p/10432151.html

时间: 2024-11-05 16:08:30

汉诺塔(代码记录+注释)的相关文章

Hanio汉诺塔代码递归实现

1.背景介绍 Hanio (汉诺塔,又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 我们姑且不去追溯传说的缘由,现考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序.这需要多少次移动呢?这里需要递归的方法.假设有n片,移动次数是f(n).显然f

算法之刻画指定尺的刻度由次引发的简单汉诺塔代码实现

1.刻度尺递归优美实现 1 # 画英式标尺,刻度线长度为 n 的 m 英寸标尺 2 # 对于开始 L = 0,直接绘制 该刻度 3 # 那么一般的情况有, 4 # 中央刻度 L >= 1 时 有 5 # 一个中央刻度为 L-1 的刻度间隔 6 # 一个中央刻度为 L 的间隔 7 # 一个中央刻度为 L-1 的间隔 8 # 设计思路: 分三个功能函数,一个构建整体的 刻度尺, 一个接受画几条刻度线, 一个输出 应该画几条刻度线 9 10 def draw_line(tick_length, tic

汉诺塔(记录每种路径次数)

https://ac.nowcoder.com/acm/contest/3004/I 题意:输出汉诺塔移动过程中每一种移动的次数和移动总数. 如下A->B:XXA->C:XXB->A:XXB->C:XXC->A:XXC->B:XXSUM:XX 解法:记忆化搜索,当前状态的可以由上一状态得到. #include <cstdio> #include <cstring> #include <cmath> #include <algor

C语言之算法初步(汉诺塔--递归算法)

个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考.记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果.现在想起来汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b.第二,把a上的最下面的盘移到c.第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了.所以算法看起来就简单多了.不过,思考过程还是很痛苦的,难以理解.递归中会保存数据的好处在这里又得到体现,太神奇了. 汉诺塔代码如下:

递归之汉诺塔

递归的定义: 一个函数自己直接或间接调用自己(一个函数调用另外 一个函数和他调用自己是一模一样的,都是那三步, 只不过在人看来有点诡异.) 递归满足的三个条件: 1.递归必须得有一个明确的终止条件 2.该函数处理的数据规模必须在递减 3.这个转化必须是可解的. 循环和递归: 理论上循环能解决的,肯定可以转化为递归,但是这个 过程是复杂的数学转化过程,递归能解决不一定能转化 为循环,我们初学者只要把经典的递归算法看懂就行, 至于有没有能力运用看个人. 递归: 易于理解 速度慢 存储空间大 循环 不

汉诺塔(hanoi)

汉诺塔代码: def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) print(x,'-->',z) hanoi(n-1,y,x,z) n = int(input('Input your number:')) hanoi(n,'X','Y','Z') 原文地址:https://www.cnblogs.com/LoganChen/p/10111715.html

汉诺塔问题(Hanoi)的C++代码实现

1 #include <iostream> 2 using namespace std; 3 //第一个塔为初始塔,第二个塔为中转塔,第三个塔为目标塔 4 5 int i = 1; //记录步数 6 void move(int n,char from,char to) //将编号为N的盘子由from塔转移到to塔 7 { 8 cout<<"第"<<i++<<"步:将"<<n<<"号盘子

关于汉诺塔,C++代码,代码效果演算

 1.故事介绍 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上依照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从以下開始按大小顺序又一次摆放在还有一根柱子上.而且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次仅仅能移动一个圆盘. 2.由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在当中一根针

python3汉诺塔简单实现代码

小时候喜欢玩汉诺塔,今天用python实现简单的汉诺塔功能 代码: def hannoi(n,x,y,z): if n==1: print(x,'-->',z) else: hannoi(n-1, x, z, y) print(x,'-->',z) hannoi(n-1, y, x, z) n=int(input("请输入x,yz:")) hannoi(n, "X", "Y", "Z") 原文地址:https://