【递归】汉诺塔

Description

汉诺塔是一个小游戏,如图,有三根木桩,从左到右分别是1、2、3,有n个盘子,从小到大编号分别为1~n(图中n = 3),初始状态下,n个盘子都在1号木桩上,并且盘子从上到下编号递增。

游戏的目标是把所有盘子从木桩1移动到木桩3上。

游戏规则:

1、 每次只允许移动一个盘子

2、 移动盘子时,编号大的盘子不能移动到编号小的盘子上面,也就是要保持每根木桩上的盘子从上到下都是递增的(任何编号的盘子都能直接移动到空的木桩上)

请写一个程序来完成游戏目标,请注意,程序的输出与图中的输出不同,比图中多了from peg x,x表示木桩编号,如:

Input

第一行是一个数字t,表示有t个测试用例

接下来的t行每一行是一个数字n,表示初始状态有n个盘子在木桩1上

Output

对于每一个用例,输出完成游戏的所有操作,每个移动操作占一行

Sample Input

1
3

Sample Output

move disk 1 from peg 1 to peg 3
move disk 2 from peg 1 to peg 2
move disk 1 from peg 3 to peg 2
move disk 3 from peg 1 to peg 3
move disk 1 from peg 2 to peg 1
move disk 2 from peg 2 to peg 3
move disk 1 from peg 1 to peg 3

Problem Source: 第四周 5班

解题思路:

basic-step:只有1个碟子,直接从起点放到终点

more-step:把n-1个碟子放到中间柱子,把第n个碟子放到终点柱子

再把n-1个碟子从中间放到终点柱子

实现代码:

#include<iostream>
using namespace std;

void hano(int n, char a, char b, char c) {//共n个碟子,起点柱子,中转暂存柱子,终点柱子
    if (n == 1)
    cout << "move disk " << 1 << " from peg " //basic-step中 ,只有1个碟子,就直接从 起点拿到终点
         << a  << " to peg " << c << endl;
    else
    {
        hano(n-1, a, c, b);                 //把n-1个碟子放到中间柱子,最后的第n个放到终点柱子
        cout << "move disk " << n << " from peg "
             << a << " to peg " << c << endl;
        hano(n-1, b, a, c);               //再把中间柱子的n-1个碟子放到终点柱子
    }
}

int main() {
    int t, n;
    cin >> t;
    for (; t > 0; t--) {  //t个测例
        cin >> n;
        hano(n, ‘1‘, ‘2‘, ‘3‘);
    }
}      
时间: 2024-09-15 14:22:43

【递归】汉诺塔的相关文章

【数据结构与算法】递归汉诺塔

汉诺塔 汉诺塔是根据一个传说形成的数学问题(关于汉诺塔): 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 递归汉诺塔 解题思路: 可以把问题简化成2个盘子的情况,如:A上有两个盘子,B和C是空的.如果要把A的两个盘子全部移动到C,需要经过以下步骤: 1.A移动一个盘子到B 2.A移动一个盘

递归汉诺塔

/*汉诺塔的玩法: * 游戏的规则:将A柱上的盘子移动到C柱上,大盘必须在小盘之上. * 1 当A柱上只有一个盘子的时候,直接移动到C柱上: * 2 当A柱上有两个盘子的时候, *   将A柱上的1盘(从上到下编号)移动到B柱, *   将A柱上的2盘移动到C柱, *   将B柱上的1盘移动到C柱: *   (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱) * 3 当A柱上有三个盘子的时候,将A柱上的1~2盘移动到B柱, *   将A柱

Acdream 1219 The Towers of Hanoi Revisited(递归汉诺塔问题)

传送门 The Towers of Hanoi Revisited Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You all must know the puzzle named "The Towers of Hanoi". The puzz

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

递归——汉诺塔问题(python实现)

规则 每次移动一个盘子 任何时候大盘子在下面,小盘子在上面 方法 假设共n个盘子 当n=1时: 直接把A上的一个盘子移动到C上(A->C) 当n=2时: 把小盘子从A放到B上(A->B)这里开始采用参数,rsc源地址=A,dst目的地址=B 把大盘子从A放到C上( A->C)rsc=A, dst=C 把小盘子从B放到C上(B->C)rsc=B, dst=C 当n=3时: 把A上的两个盘子,通过C移动到B上去, 调用递归实现(A-C->B)rsc=A, trans中转=C, d

递归--汉诺塔问题 (Hanoi)

汉诺塔问题(Hanoi):古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求输出移动的步骤 . 结题思路:利用递归思想结题,就是找出其每步的共同规律,然后必须有一步是递归的终止条件. 先假设第一种情况:3根柱,从左到右A,B,C,上面小号,底部大号,从上往下递增. 如要完成该任务,经历3

函数递归——汉诺塔经典题型

理解汉诺塔游戏规则,有A,B,C座塔,将A塔上的圆盘移动到C塔上,当A塔只有一块圆盘时,直接移动到C塔,当A塔有N个圆盘时,需要将N-1个圆盘移动到B塔,然后将剩下的最底下圆盘移动到C.大盘不能压住小盘 汉诺塔游戏主要考虑到最底下圆盘的调用,每次的移动都假设到最底下圆盘. 其实到目前我还是不太明白 def move(n, x, y, z): if n==1: print (x,'-->',z) return move(n-1,x,z,y)#将前n-1个盘子从x移动到y上 move(1,x,y,z

python 递归-汉诺塔

# 汉诺塔 a = "A" b = "B" c = "C" def hano(a, b, c, n): if n == 1: print("{} --> {}".format(a, c)) if n == 2: print("{} --> {}".format(a, c)) print("{} --> {}".format(a, b)) print("{} -

PKU《程序设计》专项课程_递归汉诺塔问题

取自coursera.org上公开课北京大学<C程序设计进阶> 递归调用注意的点 1.关注点放在求解的目标上,递推是,目标放在开头 2.找到第N次和第(N-1)次之间的关系,通项公式 3.给出边界(比如第1次执行结果,斐波那契数列是第1次和第2次结果) #include <iostream> using namespace std; void move(int m,char x, char y,char z) { if(m==1) { cout<<"把一个盘子

递归--汉诺塔

---恢复内容开始--- //n:盘子个数 a,b,c用字符表示三根柱子 void hanoiTower(int n, char a, char b, char c) { static int step = 0; if (n == 1) { cout << ++step<<": "<<a << "→" << c << endl; return; } else { hanoiTower(n - 1