河内塔算法

河内塔算法

  • 河内塔(hanoi)算法
    河内塔算法的介绍网上资料很多,我在这里再把需求简单说一下,有三棵柱子(A,B,C),A柱子上套了n个从小到大的圆环,要把这所有的n个圆环移动到C柱子上.

规则:小的圆环只能放到大的圆环上面,或者这个圆环下面没有圆环

  • 下面我先把算法放出来
void  hanoi(int n, char A, char B, char C) {
    if(n == 1) {
        printf("Move sheet %d from %c to %c\n", n, A, C);
    } else {
        hanoi(n-1, A, C, B);
        printf("Move sheet %d from %c to %c\n", n, A, C);
        hanoi(n-1, B, A, C);
    }
}
int main() {
        int n;
        printf("请输入盘数:");
        scanf("%d", &n);
        hanoi(n, 'A', 'B', 'C');
        return 0;
}

理解:河内塔是个很好的理解递归的算法问题,只有一个圆环的时候即是终止条件,大于1的时候递归,我是这样理解的:

n = 1; 直接把A上的环移到 C
n = 2;先把上面小的从A移到B,再把下面大的从A移到C,再把小的从B移到C
当n>2时,把上面的n-1个看成一个整体,这样就变成了n=2的问题了,把上面n-1个作为整体的从A移到B,再把下面大的从A移到C,再把n-1个从B移到C,此时我们压力考虑的就就是怎么把n-1个移到C的问题,把 n-1 看成 上面的n-2个下面的 1个,又是变成两个环的移动问题了…以此类推,直到下面的环都移动完了,只剩上面最后一个就是 n=1的情况,直接移到C就完成了所有环的移动.
即每次只移动最下面一个环,上面的交给递归完成

河内 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内 背包问题(Knapsack Problem) 数、运算 蒙地卡罗法求 PI Eratosthenes筛选求质数 超长整数运算(大数运算) 长 PI 最大公因数、最小公倍数、因式分解 完美数 阿姆斯壮数 最大访客数 中序式转后序式(前序式) 后序式的运算 关于赌博 洗扑克牌(乱数排列) Craps赌博游戏 约瑟夫问题(Josephus Problem) 集合问题 排列组合 格雷码(Gray Code) 产生可能的集合 m元素集合的n个元素子集 数字拆解 排序 得分排行 选择、插入、气泡排序 Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法(三) 合并排序法 基数排序法 搜寻 循序搜寻法(使用卫兵) 二分搜寻法(搜寻原则的代表) 插补搜寻法 费氏搜寻法 矩阵 稀疏矩阵 多维矩阵转一维矩阵 上三角、下三角、对称矩阵 奇数魔方阵 4N 魔方阵 2(2N+1) 魔方阵 堆叠、伫列 堆叠 - 使用阵列实作 堆叠 - 使用链结实作(C 语言动态记忆体宣告) 堆叠 - 使用 Java 作物件封装 伫列 - 使用阵列实作 伫列 - 使用链结实作(C语言动态记忆体宣告) 伫列 - 使用Java 作物件封装 其它 自产生程式(quine)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值