当前位置: 首页 > news >正文

汉诺塔问题——用贪心算法解决

目录

一:起源

二:问题描述

三:规律

三:解决方案

递归算法

四:代码实现

复杂度分析


一:起源

汉诺塔(Tower of Hanoi)问题起源于一个印度的古老传说。在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的 64 片金片,这就是所谓的汉诺塔。

不论白天黑夜,总有一个僧侣按照下面的法则移动这些金片:

I. 一次只移动一片,不管在哪根针上

II. 小片必须在大片上面

僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

二:问题描述

有三根柱子(通常标记为 A、B、C),在其中一根柱子(如 A 柱)上从下到上按大小顺序摞着 n 个圆盘,要求把这 n 个圆盘从起始柱移动到目标柱,每次只能移动一个圆盘并且在移动过程中任何时候都不能出现大盘在小盘上面的情况。辅助柱用于在移动过程中临时存放圆盘。

三:规律

  • 移动次数规律:对于 n 个圆盘的汉诺塔问题,最少需要移动的次数为 \(2^n - 1\) 次。

例如:

当 (n = 1) 时,只需移动 1 次;

当 (n = 2) 时,需要移动 (2^2 - 1 = 3) 次;

当 (n = 3) 时,需要移动 (2^3 - 1 = 7) 次,

以此类推。

  • 递归规律:可以将 n 个圆盘的汉诺塔问题分解为三个子问题:
    1. 把上面的 \(n - 1\) 个圆盘从起始柱借助目标柱移动到辅助柱。
    2. 把最大的第 n 个圆盘从起始柱移动到目标柱。
    3. 把 \(n - 1\) 个圆盘从辅助柱借助起始柱移动到目标柱。

三:解决方案

递归算法

递归是解决汉诺塔问题最常用的方法,其核心思想是将大问题分解为小问题

说到这,小伙伴们是否会自然而然会想到分治算法呢?(C语言)算法复习总结2——分治算法-CSDN博客

四:代码实现

#include <stdio.h>

// 递归函数用于解决汉诺塔问题
void hanoi(int n, char source, char target, char auxiliary) {
    if (n == 1) {
        // 当只有一个圆盘时,直接从源柱移动到目标柱
        printf("Move disk 1 from %c to %c\n", source, target);
        return;
    }
    // 把 n-1 个圆盘从源柱借助目标柱移动到辅助柱
    hanoi(n - 1, source, auxiliary, target);
    // 把第 n 个圆盘从源柱移动到目标柱
    printf("Move disk %d from %c to %c\n", n, source, target);
    // 把 n-1 个圆盘从辅助柱借助源柱移动到目标柱
    hanoi(n - 1, auxiliary, target, source);
}

int main() {
    int n = 3;  // 圆盘的数量
    // 调用 hanoi 函数开始移动圆盘
    hanoi(n, 'A', 'C', 'B');
    return 0;
}

复杂度分析
  • 时间复杂度:由于每次递归调用都会将问题规模减小 1,且每次调用会产生两个新的递归调用,所以时间复杂度为 (O(2^n))
  • 空间复杂度:递归调用栈的最大深度为 n,因此空间复杂度为 (O(n))

相关文章:

  • Java数据库连接池详解:类型、特点、区别及配置方式
  • OpenCV 关键点定位
  • 在 Java 中实现异步编程:CompletableFuture 使用指南!
  • app逆向专题五:新快报app数据采集
  • wx212基于ssm+vue+uniapp的科创微应用平台小程序
  • 7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant
  • 详解 Https 和加密、摘要、签名、数字证书
  • 第十一天 - MySQL/SQLite操作 - 数据库备份脚本 - 练习:监控数据存储系统
  • 阿里通义实验室发布图片数字人项目LAM,实现高保真重建
  • 怎么免费下载glb格式模型、和gltf格式文件模型,还可以在线编辑修改
  • 基础购物车功能总结
  • Python asyncio 入门实战-1
  • 高级:Redis 面试题精讲
  • 前端快速入门
  • 【C++】内存分配与释放、内存碎片、内存泄漏、栈溢出
  • 大模型应用开发SpringAI实战-开发自己的MCP服务
  • 深入解析xDeepFM:结合压缩交互网络与深度神经网络的推荐系统新突破
  • Vue2,Vue3知识大全
  • 费马引理和罗尔定理
  • 解密CHASE-SQL和XiYan-SQL多智能体AI如何最终实现TEXT2SQL的突破
  • 湖北宜昌:在青山绿水间解锁乡村振兴“密码”
  • 洗冤录|县令遇豪强:黄榦处理的一起地产纠纷案
  • 华泰柏瑞基金总经理韩勇因工作调整卸任,董事长贾波代为履职
  • 早期投资人蜂巧资本清仓泡泡玛特套现超22亿港元,称基金即将到期
  • 来论|建设性推进缅北和平进程——中国的智慧与担当
  • 陕西永寿4岁女童被蜜蜂蜇伤致死,当地镇政府介入处理