汉诺塔

go实现汉诺塔

喜欢而已 提交于 2019-12-16 21:08:46
go实现汉诺塔 package main import ( "flag" "fmt" "strconv" ) var num int // 可输入汉诺塔层数 var Hanoi [3][]int var disks int = 0 func init() { flag.IntVar(&num, "num", 100, "The greeting object.") } func main() { flag.Parse() if (num <= 0) { fmt.Printf("%v \n", "参数必须大于0") return } for i := num; i > 0; i-- { Hanoi[0] = append(Hanoi[0], i) } echo() hanoi(num, 0, 1, 2) } func move( from int, to int) { disks++ length := len(Hanoi[from]) Hanoi[to] = append(Hanoi[to], Hanoi[from][length-1]) Hanoi[from] = append(Hanoi[from][:length-1]) echo() } func hanoi(n int, A int, B int, C int) { if (n == 1) { move( A, C); }

汉诺塔问题

自闭症网瘾萝莉.ら 提交于 2019-12-15 05:42:03
汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。(这话不是我说的,是题目自带的)把圆盘从下面开始按大小顺序重新摆放到第二根柱子上,并且规定,每次只能移动一个圆盘,在小圆盘上不能放大圆盘。 **输入格式要求:"%d" 提示信息:“Input the number of disks:” **输出格式要求:“Steps of moving %d disks from A to B by means of C:\n” “Move %d: from %c to %c\n” 程序运行示例如下: Input the number of disks:3 Steps of moving 3 disks from A to B by means of C: Move 1: from A to B Move 2: from A to C Move 1: from B to C Move 3: from A to B Move 1: from C to A Move 2: from C to B Move 1: from A to B # include <stdio.h> void Hanoi ( int n , char a , char b , char c ) ; void Move ( int n , char a , char b ) ; int main ( ) { int n ;

递归-汉诺塔问题

自古美人都是妖i 提交于 2019-12-11 08:15:53
汉诺塔问题: 有三根柱子,开始时,所有的圆盘按从大到小的次序自下而上叠放在一根柱子上(圆锥形结构),现在要将整叠圆盘从一根柱子移到另一根柱子。移动时满足: 每次只能移动柱子 最上面一个圆盘 ; 不能出现大圆盘在小圆盘上方的情况。 将n个圆盘借助B柱 从A柱移动到C柱 public static void TowersOfHanoi ( int n , char A , char B , char C ) { if ( n == 1 ) { System . out . println ( "move disk from " + A + " to " + C ) ; return ; } TowersOfHanoi ( n - 1 , A , C , B ) ; System . out . println ( "move disk from " + A + " to " + C ) ; TowersOfHanoi ( n - 1 , B , A , C ) ; } 来源: CSDN 作者: wooHsi 链接: https://blog.csdn.net/wooHsi/article/details/103465355

汉诺塔

我是研究僧i 提交于 2019-12-09 16:45:54
【代码】 #include <stdio.h> void move(char s1,int n, char s2) { printf("move disk %d from %c to %c\n",n, s1, s2); } //X表示原始柱,Y为辅助柱,Z为目标注 void Hanoi(int n, char X, char Y, char Z) { if (n == 1) { move(X,n, Z); } else { Hanoi(n - 1, X, Z, Y); move(X, n,Z); Hanoi(n - 1, Y, X, Z); } } int main() { Hanoi(3, 'a', 'b', 'c'); return 0; } 来源: CSDN 作者: 爱吃柚子的梨 链接: https://blog.csdn.net/weixin_42545675/article/details/103457918

汉诺塔问题

徘徊边缘 提交于 2019-12-09 14:33:38
题目 :如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数 思路解析 :将 A 中的 n-1 个圆盘移到 C 中,再将 A 中的 n-1 个圆盘移到 B,再将 C 中的圆盘移到 B 上,再将 A 中的最下面的圆盘移到 C中,再 B 中的 n-1 个圆盘移到 A,再 B 中的 最下面 个圆盘移到 C,再移动 A 中的个圆盘移到 C(这里以n=3为例,建议画图) 代码实现 : public static void hanoid(int n,char a,char b,char c ) { if(n<=0) { return; } // 将上面的 n-1 个圆盘经由 C 移到 B hanoid(n-1,a,c,b); // 此时将 A 底下的那块最大的圆盘移到 C move(a,c); // 再将 B 上的 n-1 个圆盘经由 A 移到 C上 hanoid(n-1,b,a,c); } public static void move(char a, char b) { // TODO Auto-generated method stub System.out.println(a + "->" + b); } 结果展示 : 谢谢观看

Python 实现递归算法之汉诺塔

时间秒杀一切 提交于 2019-12-08 11:36:42
如图的小游戏,汉诺塔: 游戏的目的是将最左边的三块移动到最右边,游戏即为成功。 下面按照代码的步骤进行移动,三根柱子分别代表了x,y,z: 发现可以实现游戏目的! 当然,三个对于很多人来说并不难实现目标,但是当块变成了5个甚至8个呢 下面,我们来试试7个方块,同样是三根柱子,人的计算就很难实现游戏目标了 所以我们用代码来试试: 可以看到非常长,所以我来按照他的指示来进行游戏 游戏成功! 总共有128步操作,如果人为的来进行游戏的话,很有可能会出错。 所以在此运用了递归算法,编写递归函数来教我们如何进行下一步。 以下是汉诺塔的源代码: def hanoi(n ,x ,y ,z): if n == 1: print(x, '-->' ,z) else: hanoi(n-1,x,z,y) print(x ,'-->' ,z) hanoi(n-1,y,x,z) n = int(input("请输入层数:")) hanoi(n,'x','y','z') 来源: https://www.cnblogs.com/lesliechan/p/12005059.html

go实现汉诺塔

ぃ、小莉子 提交于 2019-12-06 02:51:01
go实现汉诺塔 package main import ( "flag" "fmt" "strconv" ) var num int // 可输入汉诺塔层数 var Hanoi [3][]int var disks int = 0 func init() { flag.IntVar(&num, "num", 100, "The greeting object.") } func main() { flag.Parse() if (num <= 0) { fmt.Printf("%v \n", "参数必须大于0") return } for i := num; i > 0; i-- { Hanoi[0] = append(Hanoi[0], i) } echo() hanoi(num, 0, 1, 2) } func move( from int, to int) { disks++ length := len(Hanoi[from]) Hanoi[to] = append(Hanoi[to], Hanoi[from][length-1]) Hanoi[from] = append(Hanoi[from][:length-1]) echo() } func hanoi(n int, A int, B int, C int) { if (n == 1) { move( A, C); }

汉诺塔

强颜欢笑 提交于 2019-12-05 03:49:39
一.介绍 汉诺塔传说是源于印度的古老传说。 汉诺塔游戏一共有三根柱子,第一根柱子上有若干个盘,另外两根柱子上没有盘。 柱子上的盘是按照大小从小到大的排列的,最上面的盘是最小的,越到下面越大。 每一次将任意一根柱子上最上面的一个盘放到另外一根柱子上,但要遵守以下两条: 1.每一次必须移动一个盘 2.大盘不可以压在小盘上面 我们的目标就是反复移动盘,直到把所有的盘从第一根柱子上全部移动到其他的柱子,比如,这里我们就定死,全部移动到第三根柱子,则达到目的。 以上6个盘的移动方法我做了个动画,如下所示: 二.递归 如果是第一次看到汉诺塔,估计会一下子变的手足无措。 但我们细细的去想想,从简单的开始入手,先看一个盘的情况,这个太简单了,只需要一步即可。 既然是递归,我们就要考虑问题的分解,也就是降阶。 我们考虑n个盘的汉诺塔问题(n>1)。 我们来看,最大的那个盘什么时候才可以移动走呢?因为这是最大的盘,大盘不可以压小盘,所以它移动的前提一定是在其他的盘都在另外一根柱子上,这样可以空出来一根柱子让它移动过去。而同时,它的存在并不影响任何小盘的移动。 于是我们可以把问题分解一下: 当n>1时,我们把n个盘从第一根柱子移动到第三根柱子,可以分为三个步骤: 1.把上面的n-1个盘从第一根柱子移动到第二根柱子 2.把最大的盘从第一根柱子移动到第三根柱子 3.把那n-1个盘从第二根柱子移动到第三根柱子

ACwing96 奇怪的汉诺塔 递推

ε祈祈猫儿з 提交于 2019-12-04 16:17:15
网址: https://www.acwing.com/problem/content/98/ 题意: 求$4$个塔的$$Hanoi$塔问题的最小移动步数。 题解: 三个塔时,我们知道将$n$个盘移动到一个塔的最小次数是$2^{n}-1$,令其为$d[n]$,对于$n+1$个盘,则为$(2×d[n])+1$(先移$n$个组成一个塔然后移底座,再把它们归位),所以对于$4$个塔时,我们先把$i$个盘子移动到一个塔,剩下的$n-i$个盘子转化成三个塔的问题,枚举$i$求最小值即可。 实际上,推广到$m$个塔$n$个盘的情况时,由$Frame-Stewart$算法,有最小次数: (参考博客: https://blog.csdn.net/pijk55556/article/details/100527696 ) AC代码: #include <bits/stdc++.h> using namespace std; long long dp[15], f[15]; int main() { dp[1] = 1; for (int i = 2; i <= 12; ++i) dp[i] = (dp[i - 1] << 1) + 1; f[1] = 1; for (int i = 2; i <= 12; ++i) { f[i] = (f[1] << 1) + dp[i - 1]; for (int

Python使用函数模拟“汉诺塔”过程

泄露秘密 提交于 2019-12-04 02:15:17
运行效果: 源代码: 1 # -*- coding:utf-8 -*- 2 ##汉诺塔游戏开始 3 _times=0 #用于统计移动次数 4 def hannuota(nlist,mfrom,mpass,mto): 5 global _times 6 n=len(nlist) 7 if n==1: 8 _times+=1 9 print('%-8d'%_times,nlist[0],':',mfrom,'--------->',mto) 10 else: 11 hannuota(nlist[:n-1],mfrom,mto,mpass) 12 hannuota([nlist[-1]],mfrom,mpass,mto) 13 hannuota(nlist[:n-1],mpass,mfrom,mto) 14 15 16 if __name__=='__main__': 17 print("模块独立自运行测试输出:") 18 print("二、3阶汉诺塔模拟过程如下:") 19 print('step num:from-------->to') 20 hannuota([0,1,2],'A','B','C') 来源: https://www.cnblogs.com/yijiahao/p/11828071.html