C语言案例——汉诺塔问题

题目描述

  1. 每次只能移动一个圆盘
  2. 大的圆盘不能放在小的圆盘上面
  3. 可以使用一根额外的柱子作为辅助

默认三个柱子,盘子数量为N,

解法思路

设A\B\C三个柱子

将A柱上的n个盘子挪到C柱上,只有一个盘子的时候,只需从A挪到C。如果盘子的数量大于两个,将n-1个盘子从A挪到B,再将最下面的那个盘子从A挪到C 再将B上的n-1个盘子挪到C上 ......

解法代码

cs 复制代码
#include <stdio.h>  

void move(int num, char x, char y)
{
    printf("第%d个盘子,%c--->%c\n", num, x, y);
}

void hannot(int num, char A, char B, char C)
{
    if (num == 1)
    {
        move(num, A, C);
    }
    else
    {
        hannot(num - 1, A, C, B);
        move(num, A, C);
        hannot(num - 1, B, A, C);
    }
}

int main()
{
    int num = 0; // 盘子数量  
    printf("请输入盘子的数量: ");
    scanf("%d", &num);
    hannot(num, 'A', 'B', 'C'); // A起始位置,B中转位置,C目标位置  
    return 0;
}

运行结果

请输入盘子的数量:

3

第1个盘子,A--->C

第2个盘子,A--->B

第1个盘子,C--->B

第3个盘子,A--->C

第1个盘子,B--->A

第2个盘子,B--->C

第1个盘子,A--->C

相关推荐
长友cy1 分钟前
Qt官方示例D-BusListNames阅读
开发语言
萧瑟余晖2 分钟前
Java深入解析篇六十一之编译器API(javax.tools)详解
java·开发语言
蜡台7 分钟前
Kotlin 零基础完整版实战教程|从语法入门到Android工程实战
android·开发语言·kotlin
HugoStudio_SWAN13 分钟前
洛谷 P10719 \[GESP202406 五级] 黑白格——暴力美学与图像处理的最小外接矩形
c++·图像处理·人工智能·学习·程序人生·算法·目标跟踪
那年窗外下的雪.21 分钟前
AIDC 学习日志|第 20 天|多归属业务验收与哈希不均定位
学习·算法·哈希算法
jimy124 分钟前
C++ 的 “移动语义”——Move Semantics
开发语言·c++
码云数智-园园27 分钟前
C++ STL 容器怎么选?vector、list、map、unordered_map 优缺点对比
java·开发语言
YSL07012429 分钟前
时间复杂度和空间复杂度
数据结构
en.en..34 分钟前
竖线 |:管道、按位或、掩码组合
java·开发语言
雨田言炎40 分钟前
2026/9/5 C复习笔记(一)
c语言·笔记