HDU - 1995 汉诺塔V 难度:递归入门 复杂度:有点复杂

article/2025/9/17 23:40:44

方案一(公式法)

我还不清楚用递归来解汉诺塔问题是怎么解,对递归比较陌生,但后来发现这题可以不用递归,套用下面发现的公式即可。
一个盘  1号1次
两个盘  1号2次    2号1次
三个盘  1号4次    2号2次    3号1次
四个盘  1号8次    2号4次    3号2次    4号1次
五个盘  1号16次  2号8次    3号4次    4号2次    5号1次
......
K个盘  1号2^K-1^次  2号2^K-2^次  ...k号2^K-k^次  ...K号1次
因此这题算法也极其简单,就看能不能找到这个公式了。
要注意的是这里的幂运算函数的返回值可能会超出整型范围,此种情况的解决要视具体题目的结果极限值而定,在这题中把幂函数的返回值类型设为长长整型(long long)即可。
Extra:
舍友说他一眼就看出了这个公式!因为:题目中写道64个盘子,总移动数为2^64^-1次,而
2^n^-1=1(即2^0^)+2^1^+2^2^+2^3^+...+2^n-1^
所以等式右边从左往右各项依次是n号盘,n-1号盘,n-2号盘,...,2号盘,1号盘的移动次数,所以有n个盘子时的k号盘移动次数为2^n-k^

#include<iostream>
using namespace std;
long long mi(int x, int n)//幂运算函数
{long long res = 1;for (int i = 0; i < n; i++)res *= x;return res;
}
int main()
{int T;cin >> T;int* K = new int[T+1];int* k = new int[T+1];for (int i = 0; i < T; i++)cin >> K[i] >> k[i];for (int i = 0; i < T; i++)cout << mi(2, K[i] - k[i]) << endl;return 0;
}

思路方案二(递归)

~(在想明白汉诺塔I的递归思路之后,结合师兄给的该题递归题解经过反复思索,终于把这个汉诺塔V的递归也啃了下来。也许想明白之前很难想明白,但明白之后往往就觉得不难了。所以耐心坚持很重要)~ 设三个柱分别为左中右,左是起始柱,中间是额外柱,右是目标柱。 假设总共要把K个盘从左移到右时,第k号盘需要FUN(K,k)步。 当K=k时,第k个盘子就是最底下的盘子,只需1步,所以K=k时FUN(K,k)必等于1; 否则(K肯定大于k,即K-1>=k),按以下步骤操作:

  • 先把上面K-1个盘从左移到中间,第k号盘需要FUN(K-1,k)步
  • 再把最后一个盘从左移到右,这时第k号盘不需要移动,因此不计步
  • 把中间K-1个盘从中间移到右,第k号盘需要FUN(K-1,k)步 即当K>k时第k号盘需要2*FUN(K-1,k)步。

在代码中我将这里的FUN函数取名为move,注意返回值类型需要为long long。

#include<iostream>//B递归法
using namespace std;
long long int move(int K, int k)
{if (k == K)return 1;elsereturn 2 * move(K - 1, k);
}
int main()
{int T;cin >> T;int* K = new int[T + 1];int* k = new int[T + 1];for (int i = 0; i < T; i++)cin >> K[i] >> k[i];for (int i = 0; i < T; i++)cout << move(K[i], k[i]) << endl;return 0;
}

转载于:https://my.oschina.net/u/4035395/blog/3011209


http://chatgpt.dhexx.cn/article/Z3Ce4tRt.shtml

相关文章

【Python学习】Python解决汉诺塔问题

摘要&#xff1a; 参考文章&#xff1a;http://www.cnblogs.com/dmego/p/5965835.html 一句话&#xff1a;学程序不是目的&#xff0c;理解就好&#xff1b;写代码也不是必然&#xff0c;省事最好&#xff1b;拿也好&#xff0c;查也好&#xff0c;解决问题就好&#xff01; 信…

C++ 汉诺塔程序实现

2019独角兽企业重金招聘Python工程师标准>>> 首先不看代码&#xff0c;汉诺塔解题步骤有三步&#xff08;设A->C&#xff09;&#xff0c;先将汉诺塔看成两部分n-1,1(n-1在上面) 第一&#xff1a;将A中的n-1个盘借助C移到B >Hanoi(n-1,a,c,b); 第二&#xff…

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

数据结构里的汉诺塔&#xff0c;递归的典型代表&#xff0c;几乎讲到递归都会讲到汉诺塔&#xff0c;今天才把汉诺塔看明白&#xff0c;惭愧啊。 不废话了&#xff0c;贴代码&#xff0c;基本思想在注释里有&#xff0c;话说往CNBLOG首页投了两次&#xff0c;两次都被小编给扯下…

递归-汉诺塔

2019独角兽企业重金招聘Python工程师标准>>> 递归&#xff08;recursion&#xff09;&#xff1a;程序调用自身的编程技巧。 反复执行的过程&#xff08;调用自身&#xff09;有跳出反复执行过程的条件&#xff08;递归出口&#xff09; import com.lifeibigdata.al…

汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 前提说明&#xff1a; ‍算法&#xff1a;当只有一个盘子的时候&#xff0c;只需要从将A塔上的一个盘子移到C塔上。 当A塔上有两个盘子是&#xff0c;先将A塔上的1号盘子&#xff08;编号从上到下&#xff09;移动到B塔上…

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手&#xff0c;看到的不喜勿喷&#xff0c;还望大神指教。 随着Node.js&#xff0c;Angular.js,JQuery的流行&#xff0c;点燃了我学习JavaScript的热情&#xff01;以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现&#xff0c;加快学习JS的步伐&…

【C语言】递归的经典问题(模拟strlen,阶乘,斐波那契数列,汉诺塔,青蛙跳台阶)

以下我分享的是关于C语言递归的比较经典的题&#xff0c;有些题提供了多种解法&#xff0c;希望可以帮助你打开思路&#xff0c;如果你有更多的解法&#xff0c;欢迎评论区留言哟~ 目录 一、输入1234&#xff0c;输出1 2 3 4 二、模拟strlen功能 1&#xff09;递归 2&…

7.递归-汉诺塔

汉诺塔问题&#xff1a; 如果求解的汉诺塔是3层&#xff0c;可以先将上面的两层看作是一个整体。先将两层经过c作为中介移动到b&#xff0c;再将第三个圆盘直接移动到c。然后再将b上面的两个圆盘移动到c&#xff0c;通过a为中介。 算法分析&#xff08;递归算法&#xff09; 我…

数据结构与算法之汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 一、汉诺塔问题 1.汉诺塔问题 起源&#xff1a;一位法国数学家曾编写过一个印度的古老传说&#xff1a;在世界中心贝拿勒斯的圣庙里&#xff0c;一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候&#xff…

汉诺塔 最优算法设计商量

2019独角兽企业重金招聘Python工程师标准>>> 引言 汉诺塔算法一向是算法设计科目标最具代表性的研究题目&#xff0c;本文存眷于如何设计多柱汉诺塔最优算法的商量。最简单的汉诺塔是三个柱子&#xff08;A、B、C&#xff09;&#xff0c;是以多柱汉诺塔的柱子个数M…

函数递归与汉诺塔

C初阶之函数递归 函数递归基本原理 什么是递归&#xff1f;程序调用自身的编程技巧称为递归recursion。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;…

分治算法的解和幂乘算法及其优化以及汉诺塔算法的介绍

分治算法就是分成若干个和原问题一样性质的子问题&#xff0c;然后逐步递归这些子问题&#xff0c;直到遇到规模很小的子问题&#xff0c;求出子问题的解&#xff0c;归结成原问题的解的算法就是分治算法 分治算法为递归问题&#xff0c;可以用来解决快排、二分归并、斐波那契数…

递归求解汉诺塔问题(详细解答)

汉诺塔移动步数的计算 具体汉诺塔的规则大家自行百度吧&#xff0c;就不介绍了&#xff0c;这里介绍一下如何求解汉诺塔移动步数的计算思想。 当汉诺塔层数为一层时&#xff0c;很显然只需要一步&#xff0c;直接从A杆移动到C杆 当层数为两层时&#xff0c;则需要三步&#x…

汉诺塔算法

2019独角兽企业重金招聘Python工程师标准>>> 有A、B和C 3跟柱子&#xff0c;在A上从下往上按照从小到大的顺序放着64个圆盘&#xff0c;以B为中介&#xff0c;把盘子全部移动到C上。移动过程中&#xff0c;要求任意盘子的下面要么没有盘子&#xff0c;要么只能有比它…

汉诺塔算法的理解

2019独角兽企业重金招聘Python工程师标准>>> 当盘子数为两个时&#xff0c;移动图如下&#xff1a; 移动规律为&#xff1a; 步骤盘子编号源柱子目标柱子11AB22AC31BC 当盘子数为3个时&#xff1a; 移动规律为&#xff1a; 步骤盘子编号源柱子目标柱子11AC22AB31CB4…

汉诺塔递归算法

2019独角兽企业重金招聘Python工程师标准>>> import java.util.Scanner;/*** 汉诺塔* * author JayChang* */ public class HanoiResolve {/*** 移动位置* * param positionA* param positionB*/public static void move(String positionA, String positionB) {Syst…

数据结构——树和二叉树 6-1 求二叉树高度 (20 分)

本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

PTA 函数题 求二叉树高度(C语言)

本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

6-1 求二叉树高度

6-1 求二叉树高度 (15 分) 本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT );其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Rig…

二叉树的构造及求解二叉树高度

题目描述 1、参考题目解释构造一棵二叉树&#xff1b; 2、求解二叉树的高度 3、有余力同学尝试打印这棵二叉树&#xff08;以树的形态&#xff0c;非必须&#xff09; 输入 A(B(E,C(D(F(,G),),) 输出 二叉树高度为: 6 代码实现 #include <iostream> //#include &l…