一. 問題描述
漢諾塔遊戲問題中的資料元素具有如下形式:
lchild:左孩子結點
rchild:右孩子結點
num:該移動步驟需要移動的盤子的編號
s:該移動步驟的起始柱
e:該移動步驟的終點柱
p[3]:三根柱子的橫座標
n:漢諾塔的層數
t:移動速度
二. 功能需求
要求輸入盤子數(2個以上有效),移動速度,開始演示漢諾塔移動的步驟;
盤子,a,b,c柱需要自己繪製;
初始時盤子在a柱上通過b柱最終移動到c柱上(其中,盤子從上往下越來越大),顯示出盤子在幾個柱之間的移動過程。
三. 實現要點
漢諾塔遊戲過程可以看做是對二叉樹的中序遍歷:
【將n-1個盤子從a移到b】 ----> 【中序遍歷左子樹】[n-1(a)->b]
【將第n個圓盤從a移到c】----> 【訪問根節點】[n(a)->c]
【將n-1個圓盤從b移到c】—> 【中序遍歷右子樹】[n-1(b)->c]
使用了二叉樹來儲存漢諾塔遊戲解決方案的移動步驟,在構造解空間樹的時候,遵循由初始柱——>目標柱,分解為兩部分:初始柱——>中轉柱和中轉柱——>目標柱,然後通過中序遍歷解空間樹演示移動過程。
漢諾塔遊戲演示過程的繪製使用了easyx圖形庫
全域性變數:p[3]三根柱子的橫座標,n盤數,t移動速度
函式:void colorline(int num, int s, int e, int color)改變線段顏色,
void printpillar()列印三根柱子,
void initgraph()繪製初始化盤子都在a柱的圖,
void moveto(int from, int to, int len)實現盤子的移動。
其中,盤子的移動速度通過呼叫sleep()函式來控制。
由於程式的圖形繪製演示功能不夠完善,目前只能演示2<=層數<=16的漢諾塔移動過程
編譯環境:vs2019,配置easyx圖形庫
四. 類定義
為二叉樹建立bitree類,其類定義如下:
#
include
#include
#include
#include
#include
#include
using
namespace std;
const
int left =40;
const
int right =
760;
const
int top =70;
const
int bottom =
450;
const
int rec_width =20;
//長方塊寬20
//720/4=180
struct
node
;int p[3]
, n, t;
//三根柱子的橫座標,盤數,移動速度
void
colorline
(int num,
int s,
int e,
int color)
;//改變線段顏色
void
printpillar()
;//列印三根柱子
void
initgraph()
;//繪製初始化盤子都在a柱的圖
void
moveto
(int from,
int to,
int len)
;//len:半盤長 實現盤子的移動
void
menu()
;//提供操作選單
class
bitree
;
在bitree類中,提供了如下成員函式:
(1) 函式的宣告:bitree(int a,int b,int c,int n);
完成的功能:呼叫成員函式create(int a, int b, int c, int n)
構造層數為n的儲存漢諾塔移動步驟的解空間樹
(2) 函式的宣告:~bitree();
完成的功能:呼叫成員函式release(node *p)
釋放解空間樹
(3) 函式的宣告:node* create(int a, int b, int c, int n);
完成的功能:建立層數為n的儲存漢諾塔移動步驟的解空間樹
(4) 函式的宣告:void postorder(node* p); //中序遍歷
完成的功能:中序遍歷二叉樹,呼叫函式moveto(int from, int to, int len)
移動盤子
(5) 函式的宣告:void release(node *p);
完成的功能:釋放二叉樹
(6) 函式的宣告:void display();
完成的功能:呼叫成員函式postorder(root)
演示漢諾塔的移動過程
五. 成果展示
資料結構11 漢諾塔問題
漢諾塔是乙個經典遞迴問題,但是我覺得確實有點繞,看了一會兒,總算有點眉目吧 假設有n層圓盤需要挪動,需要從x,y,z之間移動,那麼目的就是將最後一層的圓盤挪動到z軸上,但是要完成這一步,就需要將前n 1層所有的圓盤,按照從小到大的順序暫時放置在y軸上。將最後乙個圓盤放置到z上的時候,需要將y上的n ...
重學資料結構與演算法 漢諾塔
def hanoi n,a,b,c if n 0 hanoi n 1,a,c,b print moving from s to s a,c hanoi n 1,b,a,c hanoi 3,a b c 遞迴總體來說,要看整體,不能揪住細節不放,也就是說要按照不失一般性的思路來考慮。漢諾塔可以總結出3個...
資料結構課設
10 多種基本內排序方法的實現 問題描述 設計乙個合成的排序程式。可供排序的方法是 插入排序 快速排序 歸併排序 堆排序。要求程式具有 1 顯示排序結果.2 提供最好和最壞情況下對比計時的功能。3 提供在不同陣列元素的個數情況 當n分別等於100,1000,5000,20000時 下各種排序演算法的...