经典指数          
原因
2609
浏览数
0
收藏数
 

对于传统的汉诺塔游戏我们做一个拓展,我们有从大到小放置的n个圆盘,开始时所有圆盘都放在左边的柱子上,按照汉诺塔游戏的要求我们要把所有的圆盘都移到右边的柱子上,请实现一个函数打印最优移动轨迹。 给定一个int n,表示有n个圆盘。请返回一个string数组,其中的元素依次为每次移动的描述。描述格式为: move from [left/mid/right] to [left/mid/right]。 测试样例: 1 返回:move from left to right

     举报   纠错  
 
切换
1 个答案
import java.util.*; public class Hanoi { private String[] pos = {"left", "mid", "right"}; public ArrayList getSolution(int n) { return getSolution(n, 0, 2); } public ArrayList getSolution(int n, int from, int to) { if(n==0) return new ArrayList(); ArrayList list = getSolution(n-1, from, 3-from-to); list.add("move from "+pos[from]+" to "+pos[to]); list.addAll(getSolution(n-1, 3-from-to, to)); return list; } } 先把三个柱子编码0,1,2。 假设我们从柱子x向柱子y移动n个盘,由于大的不能放小的上面,所以移动最下面一个的时候前面n-1个一定按顺序排在第三个柱子(编码为3-x-y)上,将最后一个从x移到y,再把3-x-y上的全移动到y。递归得到答案。
 
切换
撰写答案