亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java 漢諾塔Hanoi遞歸、非遞歸(仿系統遞歸)和非遞歸規律 實現代碼

2019-11-26 16:07:11
字體:
來源:轉載
供稿:網友
程序如下:
復制代碼 代碼如下:

View Code
 /*
  * Hanoi塔游戲 問題描述:
  * 漢諾塔:漢諾塔(又稱河內塔)問題是源于印度一個古老傳說的益智玩具。
  * 大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照
  * 大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小
  * 順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在
  * 三根柱子之間一次只能移動一個圓盤。
  *
  * fuction:實現 hanoi塔
  *             1.遞歸實現
  *             2.非遞歸實現
  * author:iGeneral
  * date:2013.04.26
  *
  * expe:
  *         1.注意:塔的狀態:當status=1時,表示可以直接將該Disk移動到目標塔
  *                 而不是用Disk的id來判斷輸出
  *         2.System.out.println();
           System.out.println((int)3.3%3);
           沒有(int)時,輸出:0.299999
           加上(int)后,輸出:0
  */
 package part03.chapter10;

 import java.util.Scanner;

 public class _2exercise {

     public static void main(String[] args) {

         Scanner scanner = new Scanner(System.in);
         System.out.println("請輸入Hanoi碟子的數量:");
         int diskNum = scanner.nextInt();
         Hanoi hanoi = new Hanoi();
         System.out.println("遞歸實現:");
         hanoi.play_recursive(diskNum, 'A', 'B', 'C');
         System.out.println("非遞歸實現(模仿遞歸思想):");
         hanoi.play_non_recursive(diskNum);
         System.out.println("非遞歸實現(根據Hanoi規律):");
         hanoi.play_regular(diskNum);

     }

 }

 class Hanoi {

     // 遞歸實現
     public void play_recursive(int num, char A, char B, char C) {
         if (num == 1) {
             System.out.println(A + " -> " + C);
             return;
         } else {
             play_recursive(num - 1, A, C, B);
             System.out.println(A + " -> " + C);
             play_recursive(num - 1, B, A, C);
         }

     }

     // 非遞歸實現:模仿遞歸思想
     public void play_non_recursive(int diskNum) {
         Stack stack = new Stack();
         stack.push(new Disk(diskNum, 'A', 'B', 'C'));
         Disk popDisk = null;
         while ((popDisk = stack.pop()) != null) {
             if (popDisk.status == 1) {
                 System.out.println(popDisk.A + " -> " + popDisk.C);
             } else {
                 // 反順序添加
                 // 將執行移動 popDisk 的下一步的Disk添加到Stack
                 stack.push(new Disk(popDisk.status - 1, popDisk.B, popDisk.A,
                         popDisk.C));
                 // 將一個status為 "1" 且移動順序與 popDisk 相同的Disk 添加到Stack中
                 stack.push(new Disk(1, popDisk.A, popDisk.B, popDisk.C));
                 // 將執行移動 popDisk 的前一步的Disk添加到Stack中
                 stack.push(new Disk(popDisk.status - 1, popDisk.A, popDisk.C,
                         popDisk.B));
             }
         }
     }

     // 非遞歸實現:根據Hanoi規律
     public void play_regular(int diskNum) {

         // 根據規律,需要根據 Disk 的個數,多塔的位置進行調整
         // 塔的個數為偶數時,將三個塔按“A->B->C”的順序排列成三角形
         // 塔的個數為奇數時,將三個塔按"A->C->B"的順序排列成三角形
         // 將diskNum個Disk按”上小下大“的順序放在A塔中(堆棧實現),同時將B塔和C塔置空
         Stack_play_regular A = new Stack_play_regular('A');
         Stack_play_regular B = new Stack_play_regular('B');
         Stack_play_regular C = new Stack_play_regular('C');
         for (int i = diskNum; i > 0; i--) {
             A.push(i);
         }
         // 將三個塔模擬成三角形形狀排列
         Stack_play_regular[] towers = new Stack_play_regular[3];
         towers[0] = A;
         if (diskNum % 2 == 0) {
             towers[1] = B;
             towers[2] = C;
         } else {
             towers[1] = C;
             towers[2] = B;
         }
         // 最小Dish所在的塔,通過該塔在towers中的
         int towerOfMinimunDisk = 0;
         // 根據證明:n個Disk移動完成至少需要2^n-1次
         // 不斷交替進行以下兩步
         // 將最小的Disk按以上塔的順序下移到下一個塔
         // 對除了最小Disk所在的塔的另外兩個塔進行操作,可能出現兩種情況
         // 情況一:一個塔中沒有Disk,此時將存在Disk的塔最上面的Disk移動到沒Disk的塔上
         // 情況二:兩個塔都有Disk,此時對他們最上面的塔進行比較,將較小的Disk移動到較大的Disk上
         // 不會存在兩個塔都沒有Disk的情況,除非移動已經完成或未開始或只有一個盤子時的移動
         int ii = 0;
         for (int i = 0; i < (Math.pow(2, diskNum) - 1);) {// --------------注意在此處不進行i++
             // 取出三個塔,使代碼更清晰
             Stack_play_regular tower = towers[towerOfMinimunDisk];
             Stack_play_regular tower_1 = towers[(int) ((towerOfMinimunDisk + 1) % 3)];
             Stack_play_regular tower_2 = towers[(int) ((towerOfMinimunDisk + 2) % 3)];
             // 移動最小的盤子
             System.out.println(tower.name + " -> " + tower_1.name);
             tower_1.push(tower.pop());
             i++;// --------------注意在此處進行i++
             towerOfMinimunDisk = (int) ((towerOfMinimunDisk + 1) % 3);
             // ------------注意此時對三個tower進行重新賦值
             tower = towers[towerOfMinimunDisk];
             tower_1 = towers[(int) ((towerOfMinimunDisk + 1) % 3)];
             tower_2 = towers[(int) ((towerOfMinimunDisk + 2) % 3)];
             // 對另外兩個塔進行處理
             if ((tower_2.getTop() != -1 && (tower_1.showTopDisk() > tower_2
                     .showTopDisk()))
             // --------------注意要再加上 tower_2.getTop() != -1
             // 進行判斷,否則可能數組訪問越界
                     || (tower_1.getTop() == -1 && tower_2.getTop() != -1)) {
                 System.out.println(tower_2.name + " -> " + tower_1.name);
                 tower_1.push(tower_2.pop());
                 i++;// --------------注意在此處進行i++
             } else if (((tower_1.getTop() != -1 && tower_1.showTopDisk() < tower_2
                     .showTopDisk()))
             // --------------注意要再加上 tower_1.getTop() != -1
             // 進行判斷,否則可能數組訪問越界
                     || (tower_1.getTop() != -1 && tower_2.getTop() == -1)) {
                 System.out.println(tower_1.name + " -> " + tower_2.name);
                 tower_2.push(tower_1.pop());
                 i++;// --------------注意在此處進行i++
             }
             ii = i;
         }
         System.out.println(ii);
     }

 }

 // 存放信息的結構體
 class Disk {
     // 從A塔通過B塔移動到C塔
     char A;
     char B;
     char C;
     // 塔的狀態:當status=1時,表示可以直接將該Disk移動到目標塔
     int status;

     // 重寫構造函數
     public Disk(int status, char A, char B, char C) {
         this.status = status;
         this.A = A;
         this.B = B;
         this.C = C;
     }
 }

 // 存放Disk的棧
 class Stack {
     // 用來存儲盤子的數組
     Disk[] disks = new Disk[10000];
     // 塔頂
     private int top = 0;

     // 查看棧頂
     public Disk stackTop() {
         return disks[top];
     }

     // 出棧
     public Disk pop() {
         if (top != 0) {
             top--;
             return disks[top + 1];
         } else {
             return null;
         }
     }

     // 入棧
     public void push(Disk disk) {
         top++;
         disks[top] = disk;
     }
 }

 // 為 play_regular(int diskNum) 創建的 Stack 類
 // 以 diskId 來表示 Disk 對象
 class Stack_play_regular {
     // 塔名
     char name;
     // 塔頂
     private int top = -1;

     public int getTop() {
         return top;
     }

     // 通過數組實現Stack,最多64個Disk
     int[] stack = new int[64];

     // 重寫構造函數,初始化塔的名字name
     public Stack_play_regular(char name) {
         this.name = name;
     }

     // 查看棧頂
     public int showTopDisk() {
         if (top == -1) {
             return -1;
         }
         return stack[top];
     }

     // 入棧
     public void push(int diskId) {
         stack[++top] = diskId;
     }

     // 出棧
     public int pop() {
         return stack[top--];
     }
 }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
这里只有视频精品| 午夜精品久久久久久久白皮肤| 国产一区二区三区在线| 久久国产色av| 久久艳片www.17c.com| 亚洲深夜福利在线| 精品自在线视频| 日韩激情av在线免费观看| 97成人在线视频| 欧美另类在线播放| 久久亚洲成人精品| 日韩精品视频免费在线观看| 大胆人体色综合| 亚洲最大成人在线| 久久久成人的性感天堂| 久久亚洲精品一区| 日韩欧美在线字幕| 国产一区二区三区在线观看网站| 在线视频国产日韩| www.欧美精品一二三区| 亚洲精品一区二区三区婷婷月| www.久久久久| 中文字幕精品在线| 欧美色播在线播放| 97在线视频一区| 久久久国产成人精品| 欧美洲成人男女午夜视频| 一级做a爰片久久毛片美女图片| 中文在线资源观看视频网站免费不卡| 国产日韩在线视频| 亚洲wwwav| 成人国产在线激情| www.日韩欧美| 欧美成在线观看| 国产日韩欧美影视| 欧美激情网站在线观看| 丝袜亚洲另类欧美重口| 岛国av一区二区在线在线观看| 亚洲成人久久电影| 欧美人交a欧美精品| 蜜臀久久99精品久久久无需会员| 成人激情春色网| 亚洲综合在线中文字幕| 在线视频国产日韩| 欧美激情精品久久久久久| 狠狠色噜噜狠狠狠狠97| 国产精品视频免费在线| 欧美性视频精品| 亚洲精品98久久久久久中文字幕| 亚洲理论在线a中文字幕| 成人免费大片黄在线播放| 精品久久久久久久大神国产| 欧美激情女人20p| 国产亚洲激情视频在线| 欧美一区二区三区图| 日韩电影免费观看在线| 精品中文字幕乱| 在线观看国产精品日韩av| 久久视频免费观看| 91精品国产自产在线观看永久| 久久在线精品视频| 国产男女猛烈无遮挡91| 成人福利网站在线观看| 高清日韩电视剧大全免费播放在线观看| 欧美麻豆久久久久久中文| 欧美在线视频网站| 在线免费观看羞羞视频一区二区| 久久成人精品视频| 欧美激情精品久久久久| 日韩高清不卡av| 日韩高清免费在线| 国产美女主播一区| 中文国产成人精品久久一| 日韩精品极品视频免费观看| 最新国产精品拍自在线播放| 欧美精品在线极品| 2019亚洲男人天堂| 久久九九有精品国产23| 国产国语videosex另类| 亚洲欧美精品一区| 少妇久久久久久| 日韩专区在线播放| 九九精品在线播放| 亚洲a中文字幕| 欧美在线视频观看| 亚洲大尺度美女在线| 中国日韩欧美久久久久久久久| 欧美日韩一区二区在线播放| 日韩成人激情影院| 国产一级揄自揄精品视频| 亚洲国产精品成人精品| 国产xxx69麻豆国语对白| 91亚洲精品一区二区| 亚洲free嫩bbb| 国产91精品网站| 国内精品400部情侣激情| 国产精品你懂得| 久久久久久亚洲精品不卡| 国产精品亚洲片夜色在线| 在线播放日韩av| 亚洲第一区中文99精品| 性色av一区二区咪爱| 国产精品美女在线观看| 俺去啦;欧美日韩| 国产精品99久久久久久久久久久久| 色老头一区二区三区在线观看| 国产成人一区三区| 日本老师69xxx| 色综合导航网站| 国产精品毛片a∨一区二区三区|国| 日韩久久免费视频| 国产精品成人av性教育| 国产亚洲激情视频在线| 欧美激情视频一区二区| 91久久国产精品91久久性色| 26uuu亚洲国产精品| …久久精品99久久香蕉国产| 日韩久久精品电影| 成人黄色中文字幕| 久久国产精品免费视频| 国产精品久久久av久久久| 欧美日韩成人在线视频| 成人精品视频久久久久| 一个色综合导航| 日韩国产中文字幕| 欧美一级电影久久| 国产精品视频网站| 精品中文字幕久久久久久| 欧美日韩国产一中文字不卡| 日韩电影在线观看永久视频免费网站| 国产亚洲视频在线观看| 成人福利网站在线观看| 在线播放亚洲激情| 国产精品久久久久久久久久东京| 69影院欧美专区视频| 91视频免费在线| 欧美日韩在线第一页| 欧美一级成年大片在线观看| 欧美精品久久久久久久久| 日本一区二区三区在线播放| 2019中文字幕免费视频| 国产精品久久久久久一区二区| 久久国产精彩视频| 亚洲老板91色精品久久| 高清欧美性猛交xxxx| 亚洲午夜精品久久久久久久久久久久| 国产区亚洲区欧美区| 国产精品美女www爽爽爽视频| 97高清免费视频| 国产精品高清在线观看| 久久久亚洲天堂| 久久久最新网址| 精品亚洲aⅴ在线观看| 国产日产欧美精品| 国产在线视频欧美| 国产精品入口日韩视频大尺度| 日韩美女av在线| 久久99精品视频一区97| 亚洲一区中文字幕| 亚洲视频电影图片偷拍一区| 国产精品第10页| 亚洲字幕在线观看| 黄色精品在线看| 久久琪琪电影院|