汉诺塔问题(java实现)
来源:互联网 发布:剑三商城捏脸数据导入 编辑:程序博客网 时间:2024/06/06 08:36
一直用Python,数据结构、算法设计什么的上大学也没学过(不是计算机专业)。那天有个习题是汉诺塔题,憋了半个小时没憋出来,就看了看网上的解释,才写出来的。。。java版
问题:
据说古代印度还是埃及有个塔叫做波罗教塔(汉诺塔),上面有三根钻石石柱(真TM有钱)。神说在第一根上面有小到大放上64个金色盘子,命令那些奴才们从第一根移动到第三根上面,搬运中必须遵守大盘在小盘下面的规矩。每天只能搬动一个,等全把盘子搬到第三个上面的时候,这个塔就崩了。。世界就灭亡了。。。让你求一求这个世界末日
这个是用递归,看网上的解释也很迷茫,自己思考了一下,大概是这么回事。第一根柱子A,第二根柱子B,第三根柱子C。A上面有N个盘子,这里先要借助B为过渡,把N-1个盘子移动到B上,再把第N个盘子移到C上去。然后以A为过渡,把N-2个盘子移到A上去,第N-1个移动到C上去,依次往下。。。。等N=1的时候,直接把盘子丢给C就好了。
代码如下:
//移动的函数 public static void move(int num,String from,String to){ System.out.println("move "+String.valueOf(num)+" from "+from+" to "+to); } public static int jiaohuan(int num,String a,String b,String c){ int count=0;//计算步数的 if (num==1){ move(num,a,c); count++; } else{ int x=jiaohuan(num-1,a,c,b);//把N-1个盘子放到B上面 move(num,a,c);//把第N个盘子给C int y =jiaohuan(num-1,b,a,c);//以A为中间过渡,把B上的盘子给C count += x+y+1; } return count; } public static void main(String args[]){ String A="One",B="Two",C="Three"; int num=3; int p=jiaohuan(num,A,B,C); System.out.println("cishu is :"+String.valueOf(p)); //打印出次数来看看用了多少步 }
num=3的时候,移动次数是7
num=4的时候,移动次数是15
num=5的时候,移动次数是31
…
num=20的时候,移动次数是1048575
也就是说,每天移动一个,就算只有20个柱子,也要移动2800多年。。。
我从这个地方看到的解释C代码
http://blog.csdn.net/kkkkkxiaofei/article/details/8333644/
一家之言,自己备忘
0 0
- 汉诺塔问题(java实现)
- 汉诺塔问题(java实现)
- 汉诺塔问题 Java实现
- 汉诺塔问题 java实现
- 汉诺塔问题(基础)(java实现)
- Java 递归实现汉诺塔问题
- java 递归实现汉诺塔问题
- 约瑟夫问题(Java实现)
- 约瑟夫问题(java实现)
- JAVA: 用java实现汉诺塔问题
- 汉诺塔问题(修改版)(java实现)
- 汉诺塔问题的算法分析与实现(Java)
- 汉诺塔问题的java递归实现
- 递归实现汉诺塔的问题---java
- 汉诺塔问题 Java 语言递归实现
- 完全背包问题(Java实现)
- 猴子报数问题(java实现)
- 8皇后问题(java算法实现)
- iOS - UITableViewCell滑动删除
- Apache FtpClient的小项目
- Java笔记(第1节)--数据类型
- Java读写修改Property文件
- iOS 获取wifi信号强度
- 汉诺塔问题(java实现)
- 03-树1 树的同构 (25分)
- 从大小为N的样本集中随机采集不同的K个样本
- C++primer 语句
- 当微软把VR头盔普及成第二台显示器时
- 关于Java内存溢出问题
- Move语义
- AppWidget(桌面小控件详解)
- MultiDex使用方法及由此导致的crash、ANR问题解决方案