資料結構課設 漢諾塔遊戲演示

2021-10-14 04:20:41 字數 2613 閱讀 7612

一. 問題描述

漢諾塔遊戲問題中的資料元素具有如下形式:

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時 下各種排序演算法的...