1. 程式人生 > >java 解決 漢諾塔問題(遞迴演算法)

java 解決 漢諾塔問題(遞迴演算法)

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Exercise6_37 extends JApplet implements ActionListener {
	int totalNumberOfDisks;
	int numberOfDisksToMove;

	int singularityPillar = 1;
	int doomPillar = 3;

	int tempPillar = 2;

	int stepsCounter = 0;

	JLabel inputLabel;
	JTextField inputField;

	JTextArea outputArea;
	JScrollPane scroller;

	public void init() {
		Container container = getContentPane();
		container.setLayout(new FlowLayout());

		inputLabel = new JLabel("輸入盤子的總數:");
		container.add(inputLabel);

		inputField = new JTextField(15);
		inputField.addActionListener(this);
		container.add(inputField);

		outputArea = new JTextArea(18, 15);
		scroller = new JScrollPane(outputArea);
		container.add(scroller);

	}

	public void actionPerformed(ActionEvent actionEvent) {
		outputArea.setText("");
		stepsCounter = 0;
		totalNumberOfDisks = Integer.parseInt(inputField.getText());
		numberOfDisksToMove = totalNumberOfDisks;

		tower(numberOfDisksToMove, singularityPillar, doomPillar, tempPillar);

		outputArea.append("\n\n共需要 " + stepsCounter + "	步!");
	}

	public void tower(int numberOfDisksToMove, int pillarNoDisksAt,
			int pillarNoDisksMoveTo, int tempPillar_) {
		if (numberOfDisksToMove == 1) {
			outputArea.append("第 " + (++stepsCounter) + "	步:" + pillarNoDisksAt
					+ " -> " + pillarNoDisksMoveTo + "\n");
		} else {
			tower(numberOfDisksToMove - 1, pillarNoDisksAt, tempPillar_,
					pillarNoDisksMoveTo);

			tower(1, pillarNoDisksAt, pillarNoDisksMoveTo, tempPillar);

			tower(numberOfDisksToMove - 1, tempPillar_, pillarNoDisksMoveTo,
					pillarNoDisksAt);

		}
	}
}

相關推薦

Python解決演算法

        move(1,a,b,c)                      把柱子a上最後1個盤子移到柱子c上        move(n-1,b,a,c)                   把柱子b上的n-1個盤子通過柱子a移動到柱子c上print move(4, 'A', 'B', 'C')

閱讀遞迴函式最容易的方法不是糾纏於它的執行過程,而是相信遞迴函式會順利完成它的任務。如果你的每個步驟正確無誤,你的限制條件設定正確,並且每次呼叫之後更接近限制條件,遞迴函式總是能夠正確地完成任務。——《C和指標》 一、遊戲規則 有三個塔,第一個塔上放了若干個盤子。要將這若干個盤子

SDUT OJ 1200

漢諾塔 Problem Description 漢諾塔(又稱河內塔)問題是印度的一個古老的傳說。 開天闢地的神勃拉瑪在一個廟裡留下了三根金剛石的棒A、B和C,A上面套著n個圓的金片,最大的一個在底下,其餘一個比一個小,依次疊上去,廟裡的眾僧不倦地把它們一個個地從A棒搬到C棒上,規定可

Python問題演算法與程式

漢諾塔問題: 問題來源:漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤,只能移動在最頂端的圓盤。有預言說

從“”看演算法

  遞迴演算法是《資料結構與演算法》中最簡潔的演算法之一,它可以非常簡明地描述“減而治之”(decrease and conquer)和“分而治之”(divide and conquer)這兩種演算法思想。遞迴演算法雖然從程式碼角度來看非常簡單,但對於新手理解起

經典演算法 in python

   遞迴演算法,把大規模問題分解成容易解決而且求解方法相同的子問題,一般用遞迴函式實現,遞迴函式就是不斷呼叫自身的函式。    舉個例子:                  俄羅斯套娃(應該都玩過,裡面最小的那個不能開啟,其他能開啟。從最小的娃娃開始,用稍大的那個娃娃套

演算法分析與實現

漢諾塔的遞迴演算法很容易理解,也非常容易實現。下面,本文討論了漢諾塔問題的非遞迴演算法,核心內容就是棧的使用技巧。 首先,對於每個柱子來說,就是一個棧,這個棧有個特點就是,大數放在下面,小數放在上面。在首次建立棧時,我們可以先儲存好這些資料,假設最小的盤子序號

java 解決 問題演算法

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Exercise6_37 extends JApplet implements ActionListener

問題求解python

漢諾塔問題遞迴求解(python) 漢諾塔(Hanoi)問題 古代有一個梵塔,塔內有三個座x,y,z壇,x座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個和尚想把這64個盤子從x座移到z座,但每次只能允許移動一個盤子,並且在移動過程中,3個座上的盤子始終

問題——時隔9個月,終於懂了

記得我第一次做漢諾塔這道題時,是2017年11月。當時,我坐在山大青島校區圖書館3樓,不知怎麼地,看到了這個題。 然後,就思考了一整天,233 當然,悲劇就是,我當時花了一天的時間還是沒有真正理解這道題遞迴的思路。 如今,我終於懂了,嘿嘿嘿。 關於遞迴: 一定不要

(優秀演算法)對經典問題的理解與講解部分引用大神程式碼,附連結。

部落格大神的優秀漢諾塔程式碼:喜歡特別冷的冬天下著雪   (侵權聯絡) 本文只是在大神思路的基礎上加以理解。 [cpp] view plain copy  print? #include <stdio.h> //第一個塔為初始塔,中間的塔為借用塔,

實現演算法詳解

這裡我們再詳細地介紹一下漢諾塔的移動原理,假設三根柱子分別是 A、B、C,一開始 A 上有 N 個圓盤,從小到大、從上到下分別是 1、2……N-1、N,我們要把 A 上的 N 個圓盤全部移動到 C 上面,且每次只能移動每根柱子最上面的一個圓盤。 我們可以反過來考慮一下,若要把 A 上的圓盤全部移動到 C 上

如何理解?

在知乎上看到一個比較容易理解的 地址:https://www.zhihu.com/question/24385418 搞清楚遞迴只要搞清兩點: 結束條件(遞迴出口)把問題規模縮小在什麼是遞迴這個問題 李冰答主借用了網路上的一張圖片,非常形象,此處引用一下

HDU 2064 III ()

//題意自己看,不懂度娘#include <stdio.h> #include <algorithm> #include <math.h> #include <

3: 與迭代實現

遞迴實現與main(): /*------------------------------------------------------ 漢諾塔主要是有三個塔座X,Y,Z,要求將從小到大編號為 1,2.....n 的 圓盤從X移動到塔座Z上,要求  (1):每次只能移動一

內部+偽圖形

1.1問題描述: 假設有三個分別命名為A,B,C的塔座,在塔座A上插有n個直徑大小各不相同的圓盤,大的在下,小的在上,且從小到大編號為1,2,3…。現要求將塔座A上的n個圓盤移到塔座C上並仍按同樣的順序疊排,圓盤移動時必須遵守以下規則: (1)每次只能移動一

HT for Web 3D遊戲設計設計--Towers of Hanoi

在這裡我們將構造一個基於HT for Web的HTML5+JavaScript來實現漢諾塔遊戲。 知道了漢諾塔的規則和演算法,現在就開始建立元素。用HT for Web(http://www.hightopo.com)現有的3D模板建立底盤和3根柱子不是問題,問題是要

Mr.J--HanioTower演算法

HanioTower(漢諾塔),資料結構高階遞迴中的經典問題,是每一個初學資料結構的同學必經之路,可能有的同學在學習C語言時候就已經遇見過這個問題。 漢諾塔的起源:相傳在古印度聖廟中,有一種被稱為漢諾塔(Hanoi)的遊戲。該遊戲是在一塊銅板裝置上,有三根杆(編號A、B、C),在A杆自下而上

【資料結構】二叉樹的構建及遍歷演算法

題目描述: 編一個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立一個二叉樹(以指標方式儲存)。 例如如下的先序遍歷字串: ABC##DE#G##F### 其中“#”表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結果。 具體程式

習題4-11 兔子繁衍問題 15 分演算法陣列演算法

一對兔子,從出生後第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。假如兔子都不死,請問第1個月出生的一對兔子,至少需要繁衍到第幾個月時兔子總數才可以達到N對? 輸入格式: 輸入在一行中給出一個不超過10000的正整數N。 輸出格式: 在一行中輸出兔子總數達到N對