经典分治 - 汉诺塔游戏

分治策略:

将父问题划分为多个子问题(注:子问题与父问题一定要具有自相似性),然后找递归出口。

1.子问题规模变小。2.子问题与父问题本质等价。

汉诺塔游戏简述:三个柱A、B、C,将从大到小的盘按规则从A柱移到B柱。

具体的分治算法实现:

1 - N从A移动到B,C为辅助。

  等价于:

  1、1 - (N - 1)从A移动到C,B为辅助

  2、把N从A移动到B

  3、1 - (N - 1)从C移动到B,A为辅助

话说当时刚开始想这个问题的时候,我把2 - N当作一个子问题移动对象,将1盘移到辅助柱子上,但这样分治出的子问题和父问题不等价.......(可以细想一下,不难)

(待更新)

原文地址:https://www.cnblogs.com/Black-treex/p/12685465.html

时间: 2024-08-28 00:26:31

经典分治 - 汉诺塔游戏的相关文章

codevs3145 汉诺塔游戏

3145 汉诺塔游戏 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子

Pyhton:汉诺塔游戏

#汉诺塔游戏攻略! def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) #将前n-1个盘子从x移动到y上 print(x,'-->',z) #将最底下的最后一个盘子从x移动到z上 hanoi(n-1,y,x,z) #将y上的n-1个盘子移动到z上 n = int(input('请输入层数:')) hanoi(n,'x','y','z') 输出结果为: 请输入层数:3 x --> z x -->

codevs3145 汉诺塔游戏(经典中的经典,不能再经典了)

题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子) 如对于n=3的情况,一个

3145 汉诺塔游戏——http://codevs.cn/problem/3145/

第一部分:题目 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子) 如对于n

CodeVs[3145 汉诺塔游戏]

题目描述 Description 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小

3145 汉诺塔游戏

题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子) 如对于n=3的情况,一个

Unity实现汉诺塔游戏

汉诺塔的规则: 有ABC三个柱子,A柱子上从小到大排列圆盘 要将A柱子上所有圆盘移动到C柱子上,每次只能移一个 圆盘放置必须从小到大,不能存在此盘子上面有比它大的存在. 比如三个汉诺塔玩法: 理理思路,大体算法就是这个样: 那么算法就很清晰了. 不知道哪一天我又想把这个游戏扩展,我决定用四个类,让游戏的设计更条理一点: Temp类//临时存储圆盘对象,就是正在移动的圆盘 Torus类//圆盘类,每个圆盘都有 Cylinder类//圆柱类,每个圆柱都用,鼠标点击触发游戏 GameManage类//

汉诺塔游戏

[题目描述] 在A.B.C三根柱子上,有n个不同大小的圆盘(设半径分别为1~n),一开始他们都叠在A上,你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: (1)每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方): (2)移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子): 例如,对于n=3的情况,一个合法的移动序列式: 1 from A to C 2 from A to B 1 fr

递归函数的经典例子(汉诺塔问题)

#include void HN(int n,char a,char b,char c); int main(int argc,char *argv[]) { int Dish_num; printf("Please Input the Dish num: "); scanf("%d",&Dish_num); while(Dish_num != 0){ printf("%d个盘子的移动步骤如下:\n",Dish_num); HN(Dish