论坛首页 编程语言技术论坛

无聊想起以前面试的时候的河内塔算法,无聊的来看下有没有其他方案

浏览 1364 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-03-31  

算法描述

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

我的实现

package com.test;

import java.util.ArrayList;
import java.util.List;

/**
 * 河内塔算法
 * 每次将待移塔上的前N-1个盘子看成一个整体依次递归移动
 * @auth wangx
 * @datetime 14-3-19 下午4:46
 */
public class TowerOfHanoi {

    /**
     * 河内塔算法主程序入口
     */
    private static void move(List<Integer> sou, List<Integer> over, List<Integer> tar, int... num){
        int n = sou.size();
        if(num.length != 0)
            n = num[0];
        if(n == 1){
            move(sou, tar);
            return;
        }
        move(sou, tar, over, n-1);
        move(sou, tar);
        move(over, sou, tar, n-1);
    }

    /**
     * 将sou塔上的最上面的盘子移动到tar塔最上面
     */
    private static void move(List<Integer> sou, List<Integer> tar){
        tar.add(0, sou.remove(0));
    }

    public static void main(String[] args) {
        List<Integer> sou = new ArrayList<Integer>(),
        over = new ArrayList<Integer>(),
        tar = new ArrayList<Integer>();
        for(int i=0; i<5; i++){
            sou.add(i);
        }
        System.out.println(sou);
        System.out.println(over);
        System.out.println(tar);
        move(sou, over, tar);
        System.out.println(sou);
        System.out.println(over);
        System.out.println(tar);
    }
}

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics