Java代码如下
public class Hanoi {//操作步骤数private static int steps = 1;public static void main(String[] args) {//盘子数目int diskNumber = 4;doTowers(diskNumber, 'A', 'B', 'C');}private static void doTowers(int diskNum, char from , char via, char to){if (diskNum>1){//针对盘子数目为diskNum的盘子堆,先将最上面的diskNum-1个盘子(即Disk 1~Disk diskNum-1)挪至中转位置doTowers(diskNum-1, from, to, via);//将剩余的最下面的一个盘子(即Disk diskNum)直接一步挪到位System.out.println("Step " + steps + ": " + "Disc" + diskNum + " " + from + "-->" + to);steps++;//将中转位置的diskNum-1个盘子(即Disk 1~Disk diskNum-1)挪至终点位置doTowers(diskNum-1, via, from, to);}//最上面那个碟子,即Disk1,从A挪到Celse {System.out.println("Step " + steps + ": "+ "Disk1 " + from + "-->" + to);steps++;}}}
测试:以4个盘子为例,运行结果如下
Step 1: Disk1 A–>B
Step 2: Disc2 A–>C
Step 3: Disk1 B–>C
Step 4: Disc3 A–>B
Step 5: Disk1 C–>A
Step 6: Disc2 C–>B
Step 7: Disk1 A–>B
Step 8: Disc4 A–>C
Step 9: Disk1 B–>C
Step 10: Disc2 B–>A
Step 11: Disk1 C–>A
Step 12: Disc3 B–>C
Step 13: Disk1 A–>B
Step 14: Disc2 A–>C
Step 15: Disk1 B–>C
汉诺塔的本质是3个栈
维基的定义只简单提到了汉诺塔的规则, 但是并没有揭示它的本质. 下面我们来分析它的本质.
1.每次只能移动1个盘: 也就说不能两个盘一齐移动, 必须按顺序1个1个套在柱子上, 而且只能从柱子的上方套入, 也能只能从柱子的上方取出.这明显就是1个先进后出的线性结构了, 因为出入口只有1个啊, 柱子的下方是不能放入和取出盘子的.先进后出的线性结构就是栈了, 套入柱子和取出盘子就是对应的压栈和出栈动作. 如果读者之前没有了解过栈的话, 个人建议先去了解下栈, 然后再往下看.2. 大盘不能套在小盘上面代表这3个栈中, 如果不是空栈, 那么压栈的元素必须比栈顶元素小, 然后才允许压栈. 这就保证栈里面的元素是从小到大排序的.总结: 汉诺塔的本质就是3个栈, 而且压栈的元素必须比栈顶元素(如果存在)小.