1. 程式人生 > >Java資料結構:漢諾塔問題

Java資料結構:漢諾塔問題

比較簡單,直接看程式碼

漢諾塔問題求解問題
public class Example3_4 {
	private int c = 0;// 全域性變數,對搬動計數

	// 將塔座x上按直徑由小到大且自上而下的編號為1至n的n個圓盤按規則移到塔座z上,y用作輔助塔座
	public void hanoi(int n, char x, char y, char z) {
		if (n == 1) {
			move(x, 1, z); // 將編號為1的圓盤從x移到z
		} else {
			hanoi(n - 1, x, z, y);// 將x上編號為1至n-1的圓盤移到y,z作輔助塔
			move(x, n, z);// 將編號為n的圓盤從x移到z
			hanoi(n - 1, y, x, z);// 將y上編號為1至n-1的圓盤移到z,x作輔助塔
		}
	}

	// 移動操作,將編號為n的圓盤從x移到z
	public void move(char x, int n, char z) {
		System.out.println("第" + ++c + "次移動: " + n + "號圓盤," + x + "->" + z);
	}

	public static void main(String[] args) {
		Example3_4 h = new Example3_4();
		h.hanoi(3, 'x', 'y', 'z');// 對於圓盤數量為3進行移動
	}
}

// 除錯結果:
// 第1次移動: 1號圓盤,x->z
// 第2次移動: 2號圓盤,x->y
// 第3次移動: 1號圓盤,z->y
// 第4次移動: 3號圓盤,x->z
// 第5次移動: 1號圓盤,y->x
// 第6次移動: 2號圓盤,y->z
// 第7次移動: 1號圓盤,x->z

相關推薦

Java資料結構問題

比較簡單,直接看程式碼 漢諾塔問題求解問題 public class Example3_4 { private int c = 0;// 全域性變數,對搬動計數 // 將塔座x上按直徑由小到大且自上而下的編號為1至n的n個圓盤按規則移到塔座z上,y用作輔助塔座 pu

python演算法和資料結構筆記--問題超詳細遞迴過程圖解(堆疊資料結構

兩個盤子時:1移動到B,2移動到A,1移動到C N個盤子時:n-1移動到B,n移動到A,n-1移動到C 3個盤子為例子,如何將問題歸納為同類的子問題 我們的目標是的第一步先將1,2號盤子移動到B 當3號盤不存在,把B,C柱換個位置,問題轉化為將2個盤子藉助C移動到B子的問題。 要將1,2

【算法與數據結構問題Java實現

== oid logs pri pan pre nbsp 問題 移動 思路:遞歸 【代碼】 1 public class Main { 2 public static void hanoi(int n, int x, int y, int z) { 3

《零基礎入門學習Python》(24)--遞迴

前言 這節課主要講解用遞迴的方法,實現漢諾塔的解答  知識點 這節課主要講解用遞迴的方法,實現漢諾塔的解答  對於遊戲的玩法,我們可以簡單分解為三個步驟: 1) 將前63個盤子從X移動到Y上。  2) 將最底下的第64個盤子從X移動

每週一演算法(1)

首先漢諾塔是使用遞迴一個非常經典的例子, 歷史故事說了也沒用,我們想象原理。 前提,三根柱子ABC,將A上的盤子數按順序挪到C,每次只能一個 1. 一個盤子,A->C 2. 兩個盤子  A->B, A->C, B->C 3. 大於兩個盤子,那

java遞迴之問題

原始碼的github地址,可以下載到本地執行 package stack.demo; /** * 漢諾塔問題: * 假設有三根柱子,x y z * x上有3個圓盤,從底部開始從大到小編號為n 到 1 * 若每次只能移動一個圓盤,且大圓盤不能在小圓盤上面 * 現在需要將3個

遞迴問題

1.題目 2.思路     1、把A上面n-1個盤子移動到B上。    2、把A上最後一個移動到C;    3、把B上n-1個移動到A上,再把B上最後一個移動到C; 如此

Java資料結構複數運算大全

public class 複數運算 { void cPlus(double a, double b, double c, double d, double[] e, double[] f) {// 加法 e[0] = a + c; f[0] = b + d; }

Java資料結構割圓術求Π

利用割圓術,將一個圓分割成正多邊形,在利用多邊形邊長=圓周,求Π import java.util.*; public class 割圓術求Π { public static void main(String[] args) { int n; System.

Java資料結構牛頓迭代法求非線性方程的解

根據以上思想 public class 牛頓迭代法 { static double func(double x) { //待求解方程 return x * x * x * x - 3 * x * x * x + 1.5 * x * x - 4.0; } s

Java資料結構二叉排序樹的刪除操作

嚶嚶嚶,今天補回昨天沒有寫的部落格。 二叉排序樹的刪除操作比較簡單,但是思想很全面,因此本人就寫一篇部落格紀念一下。 思想:四種類型也可以是三種 1,刪除結點p的度為2,即有左右子樹。 此時有兩種方法,第一種將結點的左子樹在中根遍歷下的最後一個結點放到p的位置。第二種是將p結點

Java資料結構中根次序遍歷二叉排序樹

        昨天離開了創新創業基地,有點難受,雖然換來了高效,但是總覺的難受,一起度過了半年,昨天離開了。 說正事,今天更新二叉排序樹的中根遍歷。         思想:其實沒啥,類似與二叉樹的非遞迴中

Java資料結構單源最短路徑問題---Dijkstra演算法

嚶擊長空 如圖: 思路:先任意找一個根節點,然後開始迴圈找連線該點所有邊,然後找到權值最小的一項,標記被訪問,然後再次迴圈找除了根節點和被訪問過的結點的邊,找到權值最小的。具體開註釋,非常詳細喲。 上程式碼: public void shortesPath(int i) { in

Java資料結構最小生成樹---Prim演算法

日常更新資料結構 思想:通過選擇一個根結點,然後遍歷其所有的邊,選擇權重最小的一個邊。然後到達相應的結點,然後再從該邊出發,依舊選擇權重最小的邊到達下一個結點。(目的是為了使A到各個結點的權值和最小) 原圖為上述圖。 過程:A開始遍歷AB,AC,AD。發現AD權值最小,然後選擇AD

Java資料結構圖的深度優先遍歷和廣度優先遍歷

更新啦,更新啦。 圖的深度優先遍歷:通過一個結點開始遍歷,直到遍歷到該結點沒有下一個結點為止,然後開始遞迴下一個結點,如果被訪問過,則跳過遍歷,依次類推。類似於一口氣到底,如果沒到底,則換個結點繼續到底。如果被訪問過的結點則不需要遍歷。 過程:A開始進入遞迴,A先列印。然後發現A的下一

Java資料結構前序和中序還原二叉樹

根據二叉樹前根中根遍歷出來的陣列還原二叉樹。 前根:ABDGCEFH           中跟:DGBAECHF 上程式碼: private BinaryNode<T> create(T[] prelist, T

Java資料結構二叉樹的層次遍歷

真香啊,前天還說日更部落格,昨天就真香了。 層次遍歷類似於二叉樹後根遍歷的非遞迴形式。依靠佇列輔助完成。 思路:從根節點開始,遇到結點則將它的子結點入隊,列印此結點後,再出隊一個結點,然後將該結點的子結點入隊。依次類推。 思路:從0開始,將1,2入隊,此時佇列中只有1,2然後列印0

Java資料結構二叉樹的前序,中序,後序遍歷(遞迴和非遞迴)

嚶嚶嚶,兩個月沒寫部落格了,由於有點忙,今天開始日更部落格。 今天總結一下學習樹的先根,中根,後根。每種兩種方法,遞迴和非遞迴。 先根: 遞迴: 思路:先根遍歷,即第一次遇到的結點就開始列印。先一直遍歷左子樹,直到未空,然後右子樹,直到為空。遞迴下去。 過程:先將1進入方法

Java資料結構求二叉樹一個結點的父母結點

類似於二叉樹的遍歷,引用結點的左右結點與待查結點進行比較 public BinaryNode<T> getParent(BinaryNode<T> node) { if (root==null || node==null || node==

Java資料結構二叉樹的遍歷

嚶嚶嚶,依舊是遞迴,從根節點開始分支左右樹,然後進入遞迴 上程式碼: public T search(T key) //查詢並返回首次出現的關鍵字為key元素 { return searchNode(root, k