国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java 漢諾塔詳解及實(shí)現(xiàn)代碼

java 漢諾塔詳解及實(shí)現(xiàn)代碼

2020-09-21 14:23Java之家 Java教程

這篇文章主要介紹了java 漢諾塔詳解及實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下

java 漢諾塔詳解及實(shí)現(xiàn)代碼

實(shí)現(xiàn)效果圖

java 漢諾塔詳解及實(shí)現(xiàn)代碼

打印的方法在 moveTheTopOne() 方法中被調(diào)用,調(diào)用該方法前打印出移動(dòng)的方向--從X號(hào)塔往Y號(hào)塔

漢諾塔要求:將第一座塔上的所有盤子,借助第二座塔,全部搬運(yùn)到第三座塔上。

規(guī)則:一次只能搬運(yùn)一個(gè)盤子,不準(zhǔn)將大盤子落在小盤子上。

 漢諾塔實(shí)現(xiàn)代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
public class NewHanoi {
  public static int tiers = 4; // tiers 層數(shù)
  private static List<String> pagoda1 = new ArrayList<String>(); // 靜態(tài)指針
  private static List<String> pagoda2 = new ArrayList<String>();
 
  private static List<String> pagoda3 = new ArrayList<String>();
 
  // 映射,用來確定并打印塔的序號(hào)(使用角標(biāo)),也可以使用 Map
 
  private static List[] mapping = {pagoda1, pagoda2, pagoda3};
 
 
  public static void main(String[] args) {
    preparePagoda(pagoda1, tiers);
    System.out.println("初始狀態(tài):");
    printPagodas();
    hanoi(tiers, pagoda1, pagoda2, pagoda3);
    System.out.println("最后結(jié)果:");
    printPagodas();
  }
  // --準(zhǔn)備盤子(添加-字符串) (源塔)上
  private static void preparePagoda(List<String> srcPagoda, int tiers) {
 
    // 用于拼裝塔層的容器
    StringBuilder builder = new StringBuilder();
 
    // 源塔的每一層加盤子,從底層開始, i ‘代表'盤子的直徑大小,等于組成盤子的"^"個(gè)數(shù)
    for(int i = tiers; i > 0; i--){     
 
      // 每一層由 2*tiers-1 個(gè)格子組成,代表盤子大小的"^"格子由空格隔開
      for(int k = 0; k < tiers - i; k++) builder.append(" "); // 盤子左邊的空格,數(shù)量為 [2*tiers-1-(2*i-1)]/2 = tiers-i, 右邊相同
      for(int j = 1; j <= 2*i-1; j++){    // 盤子所占格數(shù)
        if(j % 2 == 1) builder.append("^"); // 間隔擺放
 
        else builder.append(" ");
      }
      for(int k = 0; k < tiers - i; k++) builder.append(" "); // 盤子右邊的空格
 
      srcPagoda.add(builder.toString());  // 添加到塔上
      builder.delete(0, builder.length()); // 下一循環(huán)前清空容器
    }
  }
  // --打印塔的現(xiàn)狀
 
  private static void printPagodas(){
 
     // 打印層數(shù)為三座塔-現(xiàn)狀的最大高度
    int len = Math.max(pagoda1.size(), Math.max(pagoda2.size(), pagoda3.size()));
    // 用于-塔的空層顯示
 
    StringBuilder spaces = new StringBuilder();
    spaces.append("-");  // --添加塔的左外框
    for(int i = 0; i < 2*tiers-1; i++) spaces.append(" "); // 空層顯示用空格
    spaces.append("-\t"); // --添加塔的右外框和塔間間隔   
 
    
 
    for(int i = len - 1; i >= 0; i--){ // 從頂層開始     
 
      // 三座塔同一水平面的塔層放在同一行顯示
      // 當(dāng)某個(gè)塔不存在此層時(shí),List.get(index)會(huì)拋角標(biāo)越界異常,使用try-catch處理:此層顯示一層空格
      try { System.out.print("-" + pagoda1.get(i) + "-\t");
      } catch (Exception e1) { System.out.print(spaces);
      }
      try { System.out.print("-" + pagoda2.get(i) + "-\t");
      } catch (Exception e) { System.out.print(spaces);
      }
      try { System.out.print("-" + pagoda3.get(i) + "-\t");
      } catch (Exception e) { System.out.print(spaces);
      }
      System.out.print("\r\n");
    }
  }
  // 這個(gè)方法(遞歸的核心方法)從指定的源塔上移動(dòng)-指定數(shù)量的盤子-到指定的目標(biāo)塔上
 
  public static void hanoi(int moveNum, List<String> from, List<String> middle, List<String> to) {
    if(moveNum == 1){ // 遞歸到移動(dòng)一個(gè)盤子時(shí),使用 move 方法
      moveTheTopOne(from, to);
      return;
    }
 
    // 將實(shí)現(xiàn)分為三步,一,將源塔底盤上方的所有盤子移至中間塔(遞歸);二,將底盤移到目標(biāo)塔;三,將中間塔上的所有盤子移到目標(biāo)塔上(遞歸)。
    hanoi(moveNum - 1, from, to, middle);
    moveTheTopOne(from, to);
    hanoi(moveNum - 1, middle, from, to);
  }
  // 方法的名字就是他的作用
  private static void moveTheTopOne(List<String> from, List<String> to) {
    String theTopOne = from.remove(from.size() - 1);
    to.add(theTopOne);
 
    // 打印圖形,每移動(dòng)一下,打印圖形顯示
    System.out.println("********** print ***********\r\n");
    // 確定塔的序號(hào)
    int fromNum = 0, toNum = 0;
    for (int i = 0; i < mapping.length; i++) { // 遍歷塔的數(shù)組
  
      if (mapping[i] == from) {
         fromNum = i+1;
      }
      if (mapping[i] == to) {
         toNum = i+1;
      }
    }
    System.out.println("從 " + fromNum + " 號(hào)塔往 " + toNum + " 號(hào)塔\r\n");
 
    printPagodas(); // 打印圖形
  }
}

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

原文鏈接:http://www.cnblogs.com/YSO1983/archive/2010/03/16/1686812.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91影院在线观看 | 亚洲欧美日韩精品久久亚洲区 | 亚洲精品专区 | 久久久久久久成人 | 国产成人精品久久二区二区91 | 久久99精品久久久久久琪琪 | 国产激情在线 | 日韩在线看片 | 都市激情在线视频 | 中文字幕高清在线 | 久久精品一| 欧美国产日韩一区 | 欧美精品免费在线 | 中文字幕在线三区 | 91欧美激情一区二区三区成人 | 亚洲精品乱码久久久久久麻豆不卡 | 自拍偷拍视频网站 | 久热99 | 亚洲视频区| 日韩av免费播放 | 在线观看免费黄色 | 婷婷激情五月 | 精品国产精品一区二区夜夜嗨 | 日韩视频免费在线观看 | 日日夜夜天天干干 | 另类综合在线 | 精品亚洲一区二区三区四区五区 | 97久久精品人人澡人人爽 | 午夜精品在线观看 | 久久久精品国产99久久精品芒果 | 毛片网站大全 | 伊人网在线观看 | 成人精品在线视频 | 国产一区二区在线免费 | 欧美一区二区三区精品 | 丁香五月亚洲综合在线 | 久操成人 | 国产欧美一区二区视频 | 日韩色在线 | 欧美综合色 | 久久久久久网站 |