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); } }