packagedigui;importjava.util.Stack;publicclassCode02_Hanoi{// 基础班汉诺塔问题publicstaticvoidhanoi1(int n){leftToRight(n);}// 请把1~N层圆盘 从左 -> 右publicstaticvoidleftToRight(int n){if(n ==1){// base caseSystem.out.println("Move 1 from left to right");return;}leftToMid(n -1);System.out.println("Move "+ n +" from left to right");midToRight(n -1);}// 请把1~N层圆盘 从左 -> 中publicstaticvoidleftToMid(int n){if(n ==1){System.out.println("Move 1 from left to mid");return;}leftToRight(n -1);System.out.println("Move "+ n +" from left to mid");rightToMid(n -1);}publicstaticvoidrightToMid(int n){if(n ==1){System.out.println("Move 1 from right to mid");return;}rightToLeft(n -1);System.out.println("Move "+ n +" from right to mid");leftToMid(n -1);}publicstaticvoidmidToRight(int n){if(n ==1){System.out.println("Move 1 from mid to right");return;}midToLeft(n -1);System.out.println("Move "+ n +" from mid to right");leftToRight(n -1);}publicstaticvoidmidToLeft(int n){if(n ==1){System.out.println("Move 1 from mid to left");return;}midToRight(n -1);System.out.println("Move "+ n +" from mid to left");rightToLeft(n -1);}publicstaticvoidrightToLeft(int n){if(n ==1){System.out.println("Move 1 from right to left");return;}rightToMid(n -1);System.out.println("Move "+ n +" from right to left");midToLeft(n -1);}// 进阶递归版publicstaticvoidhanoi2(int n){if(n >0){func(n,"left","right","mid");}}publicstaticvoidfunc(intN,String from,Stringto,String other){if(N==1){System.out.println("Move 1 from "+ from +" to "+to);}else{func(N-1, from, other,to);System.out.println("Move"+N+" from "+ from +" to "+to);func(N-1, other,to, from);}}// 迭代版(不重要)publicstaticclassRecord{publicboolean finish1;publicint base;publicString from;publicStringto;publicString other;publicRecord(boolean f1,int b,String f,String t,String o){
finish1 =false;
base = b;
from = f;to= t;
other = o;}}publicstaticvoidhanoi3(intN){if(N<1){return;}Stack<Record> stack =newStack<>();
stack.add(newRecord(false,N,"left","right","mid"));while(!stack.isEmpty()){Record cur = stack.pop();if(cur.base ==1){System.out.println("Move 1 from "+ cur.from +" to "+ cur.to);if(!stack.isEmpty()){
stack.peek().finish1 =true;}}else{if(!cur.finish1){
stack.push(cur);
stack.push(newRecord(false, cur.base -1, cur.from, cur.other, cur.to));}else{System.out.println("Move "+ cur.base +" from "+ cur.from +" to "+ cur.to);
stack.push(newRecord(false, cur.base -1, cur.other, cur.to, cur.from));}}}}// 主函数publicstaticvoidmain(String[] args){int n =4;hanoi1(n);System.out.println("============");hanoi2(n);System.out.println("============");hanoi3(n);}}