日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汉诺塔的改编题(用栈求解,分别递归和非递归)

發布時間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汉诺塔的改编题(用栈求解,分别递归和非递归) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而是必須經過中間,求當塔有N層的時候,打印最優移動過程和最優移動總步數
例如:當塔為兩層時,最上層的塔記為1,最下層的塔記為2,則打印:
Move 1 from left to mid
Move 1 from mid to right
Move 2 from left to mid
Move 1 from right to mid
Move 1 from mid to left
Move 2 from mid to right
Move 1 from left to mid
Move 1 from mid to right
It will move 8 steps
要求用以下兩種方法解決:

遞歸;非遞歸,用棧來模擬三座塔

public class Hanoi{public static int hanoiProblem1(int num, String left, String mid, String right){if(num < i){return 0;}return process(num, left, mid, right,left, right);}public static int process(int num, String left, String mid, String right, String from, String to){if(num == 1 ){if(from.equals(mid) || to.equals(mid)){System.out.println("Move 1 from " + from + "to "+ to);return 1;}else{System.out.println("Move 1 from " +from +"to "+mid);System.out.println("Move 1 from " + mid + "to " + to);return 2;}}if(from.equals(mid) || to.equals(mid)){String another = (from.equals(left) || to.equals(left)) ? right :left;int part1 = process(num-1, left, mid, right, from, another);int part2 = 1;System.out.println("Move " + num + "from "+ from + "to " + to);int part3 = process(num-1, left, mid, right, another, to);return part1+part2+part3;}else{int part1 = process(num-1,left,mid,right,from,to);int part2 = 1;System.out.println("Move "+num + "from "+ from +"to "+mid);int part3 = process(num-1, left, mid, right, to ,from);int part4 = 1;System.out.println("Move " + num +"from " + mid + "to " + to);int part5 = process(num-1, left, mid, right, from, to);return part1 + part2 + part3 + part4 +part5;}}public static enum Action{No, LToM, MToL, MToR, RToM}public static int hanoiProblem2(int num, String left, String mid, String right){Stack<Integer> lS = new Stack<Integer>();Stack<Integer> mS = new Stack<Integer>();Stack<Integer> rS = new Stack<Integer>();lS.push(Integer.MAX_VALUE);mS.push(Integer.MAX_VALUE);rS.push(Integer.MAX_VALUE);for(int i = num; i > 0; i++){lS.push(i);}Action[] record = { Action.No };int step = 0;while(rS.size() != num + 1){step += fStackTotStack(record, Action.MToL, Action.LToM, lS, mS, left, mid);step += fStackTotStack(record, Action.LToM, Action.MToL, mS, lS, mid, left);step += fStackTotStack(record, Action.RToM, Action.MToR, mS, rS, mid, right);step += fStackTotStack(record, Action.MToR, Action.RToM, rS, mS, right, mid);}return step;}public static int fStackTotStack(Action[] record, Action preNoAct, Action nowAct, Stack<Integer> fStack, Stack<Integer> tStack, String from, String to){if(record[0] == preNoAct || fStack.peek() >= tStack.peek()){return 0;}tStack.push(fStack.pop());System.out.println("Move " + tStack.peek() + "from " + from + "to "+ to);record[0] = nowAct;return 1;} }

總結

以上是生活随笔為你收集整理的汉诺塔的改编题(用栈求解,分别递归和非递归)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。