码迷,mamicode.com
首页 > 其他好文 > 详细

汉诺塔

时间:2017-07-10 20:44:02      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:大小   记录   stat   传说   block   com   package   href   目标   

例四、汉诺塔

 

1、问题描述

 
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
 

2、结论

 
 ①如果只能移动到相邻的  那么n个圆盘需要  
  f(n)=(3^n)-1 次
②如果不加上只能移动到相邻的限制的话     那么n个圆盘需要  
  f(n)=(2^n)-1次
 

3、代码实现

 package org.Stone6762.MStack.adopt;  
  
/** 
 * @ClassName_Hanoi汉诺塔问题 
 * @author_Stone6762 
 */  
public class Hanoi {  
  
    /** 
     * @count记录是第几次移动 
     */  
    private static int count = 0;  
  
    /** 
     * @Describe_将塔座x上按直径大小自上而下编码为123...n个圆盘按规则一到塔座Z上_y做辅助塔座 
     * @param n圆盘的格式 
     * @param x起始圆盘的位置 
     * @param y辅助塔座 
     * @param z目标塔座 
     */  
    public static void hanoi(int n, char x, char y, char z) {  
        if (n == 1) {  
            move(x, 1, z);//  
        } else {  
            hanoi(n - 1, x, z, y);// 将前n-1个从x移动到y,z当辅助  
            move(x, n, z);// 将变化为n的圆盘从x移动到z  
            hanoi(n - 1, y, x, z);// 再将前n-1个圆盘从y移动到z,x当辅助  
        }  
    }  
  
    /** 
     * @Describe_移动操作_将编号为n的圆盘从x移动到z 
     * @param x 
     * @param n 
     * @param z 
     */  
    public static void move(char x, int n, char z) {  
        System.out.println("第 " + (++count) + "次移动  :" + n + "号圆盘," + x + "-->"  
                + z);  
    }  
  
    /** 
     * @Describe_规则再次变化_再加上一个只能移动到相邻的限制条件 
     * @param n 
     * @param x 
     * @param y 
     * @param z 
     */  
    public static void hanoi2(int n, char x, char y, char z) {  
        if (n == 1) {  
            move(x, 1, y);//  
            move(y, 1, z);//  
        } else {  
            hanoi2(n - 1, x, y, z);// 将前n-1个从x移动到z,y当辅助  
            move(x, n, y);// 将变化为n的圆盘从x移动到y  
            hanoi2(n - 1, z, y, x);// 再将前n-1个圆盘从z移动到x,y当辅助  
            move(y, n, z);// 将变化为n的圆盘从y移动到z  
            hanoi2(n - 1, x, y, z);// 将前n-1个从x移动到z,y当辅助  
        }  
    }  
  
    public static void main(String[] args) {  
//      Hanoi.hanoi(4, ‘x‘, ‘y‘, ‘z‘);//------可以移动到相邻的或者不相邻的  
//      Hanoi.hanoi2(4, ‘x‘, ‘y‘, ‘z‘);//-----只能移动到相邻的  
    }  
}

汉诺塔

标签:大小   记录   stat   传说   block   com   package   href   目标   

原文地址:http://www.cnblogs.com/lpd1/p/7147537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!