汉诺塔问题——Java详细算法分析
来源:互联网 发布:c语言buffer用法 编辑:程序博客网 时间:2024/06/09 21:24
大一讲c++语言时就讲过汉诺塔问题,但是博主的大一跟广大人民群众一样几乎在梦游。现在要大三了,面临的就业和考研的压力得逼自己一下了,其实汉诺塔问题有很多语言都可以实现,但是毕竟现在大头还在Java所以用Java来解决一下,废话不多说直接干货吧。 像这种有规律的问题,博主建议大家每一种情况都列出来,再找规律。
public class Hanoi { /** * @param args * @author AnonyJoker * 汉诺塔问题:有三个柱子A,B,C,A放入N个盘子,并且盘子在柱子中从大到小依次向上小盘子不能在大盘子上,求把A中的盘子移到C中最少移动几次,如何移动。注意每次只能一个 */ public static void main(String[] args) { // TODO Auto-generated method stub //定义三个柱子 String a = "A"; String b = "B"; String c = "C"; //移动的次数 int total = 0; //第一种情况:A中只有一个盘子 System.out.println(a + "移到" + c ); total ++; System.out.println("移动了" + total + "次"); //第二种情况:A中有两个盘子 System.out.println(a + "移到" + b ); total ++; System.out.println(a + "移到" + c ); total ++; System.out.println(b + "移到" + c ); total ++; System.out.println("移动了" + total + "次"); //第三种情况:A中有三个盘子 System.out.println(a + "移到" + c ); total ++; System.out.println(a + "移到" + b ); total ++; System.out.println(c + "移到" + b ); total ++; System.out.println(a + "移到" + c ); total ++; System.out.println(b + "移到" + a ); total ++; System.out.println(b + "移到" + c ); total ++; System.out.println(a + "移到" + c ); total ++; System.out.println("移动了" + total + "次"); //第四种情况:A中有四个盘子 System.out.println(a + "移到" + b ); total ++; System.out.println(a + "移到" + c ); total ++; System.out.println(b + "移到" + c ); total ++; System.out.println(a + "移到" + b ); total ++; System.out.println(c + "移到" + a ); total ++; System.out.println(c + "移到" + b ); total ++; System.out.println(a + "移到" + b ); total ++; System.out.println(a + "移到" + c ); total ++; System.out.println(b + "移到" + c ); total ++; System.out.println(b + "移到" + a ); total ++; System.out.println(c + "移到" + a ); total ++; System.out.println(b + "移到" + c ); total ++; System.out.println(a + "移到" + b ); total ++; System.out.println(a + "移到" + c ); total ++; System.out.println(b + "移到" + c ); total ++; System.out.println("移动了" + total + "次"); }}
汉诺塔问题就是把A柱上的N-1个盘子经过C移动到B,再把A上的最大的盘子移到C,而B上的N-1再类似上述步骤递归循环移到C上。 改进后的代码如下:
package com.test._1;public class Hanoi_s { /** * @param args * @author AnonyJoker * 经过分析得出规律 * @total 移动的总次数 * a代表起点,b代表中转点,c是终点 */ int total = 0; public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } private void move(String a,String c){ System.out.println("从" + a + "到" + c); total ++; } public void hanoi(int n ,String a,String b,String c){ if(n == 1){ move(a,c); }else{ hanoi(n-1,a,c,b); move(a,b); hanoi(n-1,b,a,c); } } public static void main(String[] args) { // TODO Auto-generated method stub Hanoi_s hanoi = new Hanoi_s(); hanoi.hanoi(3, "A", "B", "C"); System.out.println(hanoi.getTotal()); }}
汉诺塔问题本身并没有什么难度,主要利用的就是递归循环这个点,但是刚开始写代码时想的过程是特别痛苦的,特别是对于博主这种从小找规律就直接过的人来说更是难受。但如果放弃就肯定一直不会,只要自己想做就没有不会的东西。只要耐下心来分析,肯定会的。
这是博主第一次写博客,感觉写的有些拖沓,而且问题也没怎么讲清楚。有问题底下评论,大家一起进步。
阅读全文
0 0
- 汉诺塔问题——Java详细算法分析
- Java:i++问题(详细分析)
- 递归算法详细分析
- 递归算法详细分析
- 递归算法详细分析
- dijkstra算法详细分析
- 递归算法详细分析
- 递归算法详细分析
- BM算法详细分析
- 递归算法详细分析
- 递归算法详细分析
- 递归算法详细分析
- 递归算法详细分析
- Kruskal算法详细分析
- Java经典算法——汉诺塔问题
- 汉诺塔问题的算法分析与实现(Java)
- 算法分析——Hanoi塔问题
- 算法分析——Hanoi塔问题
- 阻止checkbox选中态
- php函数的嵌套之谜
- 大家快来A水题
- Springboot基础优酷篇
- scrapy爬虫++mysql数据库+tomcat服务器+android客户端项目demo
- 汉诺塔问题——Java详细算法分析
- maven项目build success,但是pom.xml中有红色字体
- 整数排序-未完待续
- 阿里云P2P内容分发网络(PCDN)实操手册
- js中的闭包(Closure)简例与理解(精华)
- 正则表达式的一些详解
- 图像边缘检测
- ElasticSearch的安装
- Servlet应用程序(4)----数据库