用java面向对象的思想实现的汉诺塔问题

package hanoi.com;

public class Disc {
    private String name;
    private int level;
    public Disc(){
        name = "disc";
        level = 0;
    }
    public Disc(String name, int level){
        this.name = name;
        this.level = level;
    }

    public String getName() {
        return name;
    }
    public int getLevel() {
        return level;
    }
    @Override
    public String toString() {
        return "name: " + this.name + ";level: " + this.level;
    }
}
package hanoi.com;
import java.util.LinkedList;
import java.util.List;

public class Post {
    //用来装Disc
    private List<Disc> lists = new LinkedList<Disc>();
    private String name;public String getName() {
        return name;
    }

    public Post(String name) {
        this.name = name;
    }

    public void add(Disc disc) {
        if(disc == null) return;
        this.lists.add(0, disc);
    }

    public void add(List<Disc> discs) {
        if (discs == null || discs.size() < 1) {
            return;
        }
        lists.addAll(0, discs);
    }
    //当前柱子中的盘子借助middlePost移到到targetPost
    public void move(Post middlePost, Post targetPost,PostMove postMove){
        this.move(this.lists.size(), middlePost, targetPost, postMove);
    }
    private void move(int total, Post post1, Post post2,PostMove postMove) {
        if(total <= 0) return;
        this.move(total - 1, post2, post1,postMove);

        Disc disc = this.lists.remove(0);
        if(postMove != null){
            postMove.action(this, post1,post2, disc);
        }
        post2.add(disc);

        post1.move(total -1 ,this, post2,postMove);
    }

    @Override
    public String toString() {
        return "Post [lists=" + lists + ", name=" + name + "]";
    }
}
package hanoi.com;

public interface PostMove {
    public void action(Post scrPost,Post middlePost, Post targetPost, Disc disc);
}
package hanoi.com.test;

import hanoi.com.Disc;
import hanoi.com.Post;
import hanoi.com.PostMove;

public class Main {

    public static void main(String[] args) {
        Post post1 = new Post("A");
        Post post2 = new Post("B");
        Post post3 = new Post("C");

        post1.add(new Disc("3", 2));
        post1.add(new Disc("2", 1));
        post1.add(new Disc("1", 0));

        System.out.println(post1);
        System.out.println(post2);
        System.out.println(post3);

        post1.move(post2, post3, new PostMove() {

            @Override
            public void action(Post srcPost, Post middlePost,Post targetPost, Disc disc) {
                System.out.println(disc + ":从"+ srcPost.getName()  + "通过" + middlePost.getName() + "到达" + targetPost.getName());
            }
        });
        System.out.println(post1);
        System.out.println(post2);
        System.out.println(post3);
    }

}
时间: 2024-10-25 09:52:48

用java面向对象的思想实现的汉诺塔问题的相关文章

Java编程用栈来求解汉诺塔问题的代码实例(非递归)_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 [题目] 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动过程和最优移动总步数. [解答] 上一篇用的是递归的方法解决这个问题,这里我们用栈来模拟汉诺塔的三个塔,也就是不用递归的方法 原理是这样的:修改后的汉诺塔问题不能让任何塔从左直接移动到右,也不能从右直接移动到左,而是要经过中间,也就是说,实际上

Java算法分析2—————几种排序&amp;汉诺塔算法

一:插入排序 /* * 插入排序 */ /* * 原序列 [12] 15 9 20 6 31 24 * 第0趟 [12 15] 9 20 6 31 24 * 第1趟 [9 12 15] 20 6 31 24 * 第2趟 [9 12 15 20] 6 31 24 * 第3趟 [6 9 12 15 20] 31 24 * n个数,一共需要多少趟?n个数,n-1趟 * 第0趟,把1位置的数,和1位置之前的数进行比较,按大小顺序排列 * 第1趟,把2位置的数,和2位置之前的数进行比较,按大小顺序排列 .

C#中汉诺塔问题的递归解法

百度测试部2015年10月份的面试题之——汉诺塔. 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔. 百度百科在此. 游戏试玩在此. 用递归的思想解决汉诺塔问题就是分为两种情况: 第一种情况是只有一个盘子的情况,也就是最基本的情况,这种情况下,直接将该盘子从原始塔转移到目标塔即可胜利: 第二种情况是右n个盘子的情况,也就是普遍情况,这种情况下,要将除了最底下的那个盘子以外的(n-1)个盘子从原始塔转移到辅助塔,再把最底下的那个盘子(第n个盘子)从原始塔转移到目标

汉诺塔(-) java modPow 的用法;

汉诺塔(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵 天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金 片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消

JAVA——汉诺塔

大家还记得某年春晚小品那个把大象放冰箱需要几步吗? 今天,我准备写的是汉诺塔,有三个魔法石柱,分别:诚实.勇敢.正直.其中有一个石柱上从大到小,从地向上依次排放着四个魔法圆环,需要将那四个魔法圆环分别按照大的上面放小的,不可以在小的上面放大的的:需要几步? import java.util.Scanner; public class ssr { static int step = 0; public static void main(String[] args) { //汉诺塔 hanio(4,

算法笔记_013:汉诺塔问题(Java递归法和非递归法)

目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus is possible for using animation. e.g. if n = 2 ; A→B ; A→C ; B→C; if n = 3; A→C ; A→B ; C→B ; A→C ; B→A ; B→C ; A→C; 翻译:模拟汉诺塔问题的移动规则:获得奖励的移动方法还是有可能的.

编程:递归编程解决汉诺塔问题(用java实现)

//Li Cuiyun,October 14,2016.//用递归方法编程解决汉诺塔问题package tutorial_3_5;import java.util.*; public class HanoiTower { public static void main(String[] args) { // TODO Auto-generated method stub @SuppressWarnings("resource") Scanner sc=new Scanner(Syste

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

Java学习(3):递归问题(举例:汉诺塔问题)。

递归问题是编写程序中常见的问题之一.此随笔对具有明显递归的汉诺塔问题进行说明. 1 import java.util.Scanner; 2 3 /** 4 * 递归:汉诺塔 5 * 6 * @author xcx 7 * @time 2017年7月3日上午8:16:07 8 */ 9 public class Hanoi { 10 private static int i = 0; 11 12 public static void main(String[] args) { 13 int n =