当前位置:首页 > 牛客 > 牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

5个月前 (06-27)

牛客NC67题解:汉诺塔递归算法与解题步骤 牛客题解 汉诺塔算法 递归解法 C++ 第1张

一、题目解读

牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘子,且大盘子不能放在小盘子之上。理解题目本质和递归特性是解题关键。

二、解题思路

采用递归方法解决汉诺塔问题。核心思想是将n个盘子的移动分解为三个步骤:

1. 将n-1个盘子从起始柱(from)借助目标柱(to)移动到辅助柱(aux);

2. 将第n个盘子直接从起始柱移动到目标柱;

3. 将n-1个盘子从辅助柱借助起始柱移动到目标柱。

递归的终止条件为n=1时,直接移动单个盘子。

三、解题步骤

1. 初始化:创建空向量moves用于存储移动步骤。

2. 调用递归函数:hanoi(n, "left", "right", "mid", moves),其中参数分别表示盘子数量、起始柱、目标柱、辅助柱和步骤容器。

3. 递归执行:

    当n=1时,执行基础操作,将步骤"move from X to Y"加入moves并返回。

    当n>1时,递归调用自身三次:先将n-1个盘子移到辅助柱,再移动第n个盘子,最后将n-1个盘子从辅助柱移到目标柱。

4. 返回结果:最终moves包含所有移动步骤,按顺序输出。

四、代码和注释

class Solution {
public:
    vector<string> getSolution(int n) {
        vector<string> moves;
        hanoi(n, "left", "right", "mid", moves); // 初始化递归调用
        return moves;
    }

    void hanoi(int n, string from, string to, string aux, vector<string>& moves) {
        if (n == 1) { // 基础情况:单个盘子直接移动
            moves.push_back("move from " + from + " to " + to);
            return;
        }
        // 递归三步走
        hanoi(n - 1, from, aux, to, moves); // 步骤1:移动n-1个盘子到辅助柱
        moves.push_back("move from " + from + " to " + to); // 步骤2:移动第n个盘子
        hanoi(n - 1, aux, to, from, moves); // 步骤3:移动n-1个盘子到目标柱
    }
};

五、总结

通过递归方法,汉诺塔问题被巧妙分解为子问题,代码简洁且逻辑清晰。关键在于理解递归的“大问题拆解”思路,以及三个步骤的先后顺序。在实际应用中,递归算法需注意溢出风险(对于超大n值),但本题中n的范围通常可控。掌握此类递归模型有助于解决类似需要分治策略的问题。

原创内容 转载请注明出处

分享给朋友:

相关文章

用栈结构优雅破解括号匹配难题(力扣20题)

用栈结构优雅破解括号匹配难题(力扣20题)

一、题目重新解读给定一个仅包含 ('、')、'['、']'、'{'、'}' 的字符串,判断其是否有效。有效需满足:1....

线性遍历+二进制 6行代码征服二进制链表转整数

线性遍历+二进制 6行代码征服二进制链表转整数

力扣1290.二进制链表转整数题目本质给定一个单链表的头节点head,链表中每个节点的值为0或1。链表表示一个‌最高有效位在前‌的二进制数字,要求将其转换为对应的十进制整数。例如链表1→0→1对应的二...

力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

有序数组的定位在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试图加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这...

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

题目解读‌我们面对的是一个典型的图论问题:给定一个城市的连接矩阵,需要计算其中相互连通的城市群(省份)数量。这个问题可以抽象为无向图中的连通分量计算,每个城市代表图中的一个节点,城市之间的连接关系代表...

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

题目重解想象你是一名药师,有t分钟在山上采集m种草药。每种草药需要time分钟采集,价值为num。这就像考试时分配时间做题,要选择收益最大的题目组合。题目要求计算在规定时间内能获得的最大草药价值。解题...

力扣145:递归之美 轻松掌握二叉树后序遍历

力扣145:递归之美 轻松掌握二叉树后序遍历

题目解读二叉树的后序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。这种遍历方式特别适合需要先处理子节点再处理父节点的场景,如内存释放...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。