• 台哥算法练习 汉诺塔问题


    package suanfa;
    
    /**
     * 汉诺塔问题
     * 
     * 2009年8月22日中午12点10分(周六)完成于紫金港某教室。
     * @author 台哥编程课堂 https://blog.csdn.net/chaohi
     * 
     * 写代码的最高境界:多一行则胖,少一行则瘦。
     * 如果要把10个盘子从A移到B,先要把上面的9个盘子从A移到C,然后把第十个盘子从A移到B,再接着把前9个盘子从C移到B。
    	由此可以看出,转移n个盘子所需的次数 = 转移n-1个盘子的次数 * 2 + 1 。
    	就跟那个国际象棋上放大 米的故事一样。如果盘子数很大,那移动次数是惊人的。
    	将10个盘子从A柱移动到B柱,一共要移动1023次.
    	将15个盘子从A柱移动到B柱,一共要移动32767次.
    	看看这增长速度,可想而知,要移动100个盘子,那移动的次数该有多么恐怖了。 
     *
     */
    public class HanNuoTa {
    
    	int move_num = 0;// 移动次数
    
    	/** 递归方法 */
    	public void go(int num, String x, String y) {
    		if (num == 0) {
    			return;
    		} else {
    			String z = getZ(x, y);
    			go(num - 1, x, z);
    			System.out.println("将" + num + "号盘从" + x + "移到" + y);
    			move_num ++;
    			go(num - 1, z, y);
    		}
    	}
    
    	/** 得到中转的柱子 */
    	public String getZ(String x, String y) {
    		if (!"C柱".equals(x) && !"C柱".equals(y)) {
    			return "C柱";
    		}
    		if (!"B柱".equals(x) && !"B柱".equals(y)) {
    			return "B柱";
    		}
    		return "A柱";
    	}
    
    	/** 主方法,程序入口 */
    	public static void main(String[] args) {
    		int num = 10; // 盘子数目
    		String x = "A柱"; // 盘子所在的柱子
    		String y = "B柱"; // 盘子要移往的柱子
    		HanNuoTa hnt = new HanNuoTa();
    		hnt.go(num, x, y);
    		System.out.print("将" + num + "个盘子从" + x + "移动到" + y + ",");
    		System.out.println("一共要移动" + hnt.move_num + "次.");
    	}
    	
    }
    
    

  • 相关阅读:
    上传文件
    Win10中英文的切换
    2015 4.15笔试
    wpf的学习日志(二)
    静态类
    面试宝典
    设计模式 --- 模型-视图-控制器(Model View Controller)
    设计模式 --- 单例模式(Singleton)
    iOS 应用架构浅谈
    (转)Block的使用
  • 原文地址:https://www.cnblogs.com/chaohi/p/10698005.html
Copyright © 2020-2023  润新知