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

相关推荐
lingran__4 分钟前
速通ACM省铜第二天 赋源码(Adjacent XOR和Arboris Contractio)
c++·算法
zhangfeng11336 分钟前
R geo 然后读取数据的时候 make.names(vnames, unique = TRUE): invalid multibyte string 9
开发语言·chrome·r语言·生物信息
Sally璐璐10 分钟前
Go组合式继承:灵活替代方案
开发语言·后端·golang
zzzsde10 分钟前
【c++】类和对象(4)
开发语言·c++
码熔burning11 分钟前
从 new 到 GC:一个Java对象的内存分配之旅
java·开发语言·jvm
晨非辰12 分钟前
#C语言——刷题攻略:牛客编程入门训练(十二):攻克 循环控制(四)、循环输出图形(一),轻松拿捏!
c语言·开发语言·经验分享·笔记·其他·学习方法·visual studio
gou1234123414 分钟前
Go语言io.Copy深度解析:高效数据复制的终极指南
开发语言·golang·php
书院门前细致的苹果18 分钟前
MySQL 中的 B+树和 B树的区别详解
数据结构·数据库·mysql
白玉cfc26 分钟前
【OC】单例模式
开发语言·ios·单例模式·objective-c
十六点五26 分钟前
Java NIO的底层原理
java·开发语言·python