[18/11/24] 汉诺塔问题

问题描述:要求将A柱子上的盘子移动到C柱子上,移动过程中大盘子不能在小盘子下边(即必须满足大盘在下,小盘在上),求移动步骤?

示例:若A上只有1号和2号这2个盘子,移动步骤 A(2)-->>B,   A(1)-->>C ,  B(2)-->>C  【A(2)表示柱子A上的2号盘子】

思想:用递归(以3个盘子为例)

1、若只有1个盘子,直接将他从A柱子上移动到C柱子上;

2、若有n个盘子(假设n=3,即有3个盘子),可以考虑先划分为2个部分,构成大问题。即最下边的1号盘子(部分1)和由2号和3号组成的整体(部分2, n-1个盘子),先将部分2(借助柱子C)移动到柱子B上,再将1号盘子(部分1)移动到柱子C上,最后将部分2(借助柱子A)移动到柱子C上的1号盘子上边,完成要求。

3、部分2的移动过程又是一个小问题,可以用递归。

代码示例:

 1 #include <stdio.h>
 2 void hanoi(int n,char A,char B,char C){  //大问题
 3     if(n==1){
 4         printf("%c -> %c\n",A,C); //如果只有1个盘子直接移动
 5     }else{
 6         hanoi(n-1,A,C,B);  // 部分2率先移动从A移动到B(C是过渡) ,  分解成小问题
 7         printf("%c -> %c\n",A,C);//部分1 移动
 8         hanoi(n-1,B,A,C);  //部分2 从B移动到C (A是过渡)
 9     }
10 }
11
12
13 int main()
14 {
15     int  n ;
16     printf( "输入A柱上盘子的个数:") ;
17     scanf("%d",&n) ;
18     hanoi(n,‘A‘,‘B‘,‘C‘);
19
20     return 0;
21 }

结果示例:

原文地址:https://www.cnblogs.com/ID-qingxin/p/10013660.html

时间: 2024-11-08 21:34:03

[18/11/24] 汉诺塔问题的相关文章

17.11.9 汉诺塔问题

描述 汉诺塔是约19世纪末,在欧州的商店中出售一种智力玩具.它的结构如下图所示:  在一个平板上立有三根铁针,分别记为A, B, C.开始时,铁针 A 上依次叠放着从大到小 n 个圆盘,游戏的目标就是将 A 上的 n 个圆盘全部转移到 C 上,要求每次只能移动某根铁针最上层一个圆盘,圆盘不得放在这三根铁针以外的任何地方,而且永远只能将小的圆盘叠放在大的圆盘之上. 例如,下面就是示例输出中(n = 3)移动方案的图示: 这是一个著名的问题,几乎所有的教材上都有这个问题.由于条件是一次只能移动一个盘

18.12.16 DSA 吉老师的汉诺塔

描述 吉老师的面前出现了一座汉诺塔!但是这个汉诺塔好像坏了,盘子并不是按照从大到小的顺序排列的……吉老师非常不开心,立志要把这个汉诺塔修好!吉老师每分钟可以交换挨在一起的两个盘子,吉老师希望用的时间最短,吉老师不会啊,你能帮帮吉老师吗? 输入 第一行1个整数N.第二行为N 个非负整数,按从下到上的顺序给出每个盘子的大小.对于50%的数据,2<=N<=1000.对于100%的数据,2<=N<=100000.输出一个整数,表示最少需要交换多少次相邻的盘子才能将盘子递减排列.同样大小的盘

2017.11.26 计算机算法之分治与递归——汉诺塔

1.我的递归算法(纯粹的递归) #include <stdio.h>//当盘子数n等于15时,移动次数已经达到32767,运行时间已经达到15.540s long long count; void hanoi(int n,char a,char b,char c)//借助C将A上的盘子全部移动到B { if(n==0) return; hanoi(n-1,a,c,b); printf("%c --> %c\n",a,b); count++; hanoi(n-1,c,b

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

汉诺塔的递归算法与解析

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

【汉诺塔问题】UVa 10795 - A Different Task

[经典汉诺塔问题] 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上.有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求打印移动的步骤.如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C. 如果有2个盘子,可以先将盘子1上的盘子2移动到B:将盘子1移动到c:将盘子2移动到c.这说明了:可以借助B将2个盘子从A移

汇编汉诺塔

1 .386 2 .model flat 3 .stack 4096 4 include io.h 5 ExitProcess proto near32 stdcall, ExitCode:dword 6 cr equ 0dh 7 lf equ 0ah 8 .data 9 string1 byte "请输入汉诺塔数:", cr, lf 10 strNum byte 10 dup(?) 11 result byte 10 dup(' ') 12 byte cr, lf, 0 13 .co

1019: [SHOI2008]汉诺塔

1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1495  Solved: 916[Submit][Status][Discuss] Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操作是指:从一根柱子的最上层拿一个盘子放到另一根柱子的最上层,同时要保证被移动的盘

C++学习:任意合法状态下汉诺塔的移动(原创)

汉诺塔问题: 问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 现在将问题变形为:初识时,n个金盘分散摆放在三根柱子上,并且所有金盘都处于合法状态,将这些分散的金盘全部移动到第三根柱子上,并打印每一次的移动步骤以及移动后三个柱子上金盘的状态. C++实现代码如下: 1 #ifnde