漢諾塔c語言源程序步驟,漢諾塔問題的算法分析及C語言演示程序的實現

摘要:該文對經典的“漢諾塔”問題進行了詳細的分析,并用C語言實現。通過問題的具體實現,使學習者了解問題的全過程,推廣到一般。

關鍵詞:漢諾塔;遞歸;C語言

中圖分類號:TP301.6文獻標識碼:A文章編號:1009-3044(2010)09-2130-02

Algorithm Analysis and C Realization of Hanio Issue

BAI Hui-bo1,GAO Rui-ping2

(1.Qinhuangdao Branch of Daqing Petroleum Institute, Qinhuangdao 066004, China;2.Hebei Normal University of Science and Technology, Qinhuangdao 06600, China)

Abstract: This text carries on detailed analysis about classical Hanio issue and provides realization of algorithm in C.Through concrete realization of the problem,can make learners observe the whole course which solves this issue and Extend to the general.

Key words: hanio; recursive; the C programming language

1 問題描述

漢諾塔是一個經典的數學問題,其具體描述如下:有三根相鄰的塔子,標號為A,B,C,A塔子上從下到上按金字塔狀疊放著n個不同大小的圓盤,現在把所有盤子借助于A,B,C三個塔子一個一個移動到塔子C上,并且每次移動在同一根塔子上都不能出現大盤子在小盤子上方.根據問題描述得到以下規則:

1)圓盤必須一個一個的移動;

2)大的圓盤必須在小圓盤的下方或單一圓盤;

3)滿足規則2)的序列可以出現在A,B,C任意一根塔子上。

C語言演示程序規則:

1)輸入一個盤子的個數n(時間可接受范圍內的值0

2)用C語言演示盤子在塔A,B,C間的移動全過程。

2 算法分析

題目實現的是設計一個盤子移動的方案,使得A塔上的所有盤子借助于B塔按照原來的次序移動到C塔上,并且給出完整的最佳的盤子移動的方案。

從實際的具體的盤子的移動過程來分析,找出問題內在的規律。當n=1時,問題比較簡單,只要將塔A上的編號為1盤子直接移動到塔C即可;當n>1時,需利用塔B作為輔助塔,若能設法將壓在編號為n的盤子之上的n-1個盤子從塔A(依據移動規則)移至塔B上,則可將編號為n的盤子從塔A移至塔C,然后再將塔B上的n-1個盤子(依據移動規則)移至塔C;經分析可知,在移動的過程中, 將始終會出現這樣的狀態情況: (n-1)個盤子將會以從下到上、從大到小的次序疊置在B塔上,這時,A塔上第n個盤子就能被輕而易舉疊放到C塔上; 接著, 我們再把B塔上的共(n-1)個盤子移動到C塔上, 問題好像已經解決。

但B塔上(n-1)個盤子怎么移動到C塔上呢?同樣, 利用塔C作為輔助塔, 將會出現這樣的狀態情況:(n-2)個盤子將會以從上到下、從小到大的次序疊置在A塔上,這時,B塔上第(n-2)個盤子就能被輕而易舉放到C塔上;接著,把A塔上的共(n-2)個盤子移動到C塔上。

這明顯是一個遞歸的過程,不斷深入,不斷細小化,最終,將到達僅有一個盤的情形,這時, 遞歸也就終止了,問題也得到了解決。通過以上分析,遞歸的出口是當n=1時,能直接得到解。現在,嚴格按照遞歸算法來解決問題。先定義遞歸方法Hanio(int n,zarray * A, zarray *B, zarray *C),按如下步驟進行解題(設初始盤子個數為N):若A塔上僅僅只有一個盤子(n=1), 則直接從A移動到C,問題完全解決。若A塔上有一個以上的盤子(n>1),則需要考慮以下三個步驟。

第一步: 把(n-1)個盤子從A塔經過移動, 疊放到C塔上。在不違反規則情況下,所有(n-1)個盤子不能作為一個整體一起移動,而是要符合要求地從一個塔移到另一個塔上。用Hanio(n-1,A,C,B)調用遞歸方法,注意:這里是借助于C塔,將(n-1)個盤子從A塔移動到B塔, A是源塔, B是目標塔。

第二步: 將剩下的第n個盤子(也就是最底下的一個)直接從A塔疊放到空著的C塔上。

第三步: 用第一步的方法,再次將B塔上的所有盤子疊放到C塔上。同樣,這一步實際上也是由一系列更小的符合規則的移動盤子的操作組成的。用Hanio(n-1,B,A,C)調用遞歸方法, 注意:這里是借助于A塔,將(n-1)個盤子從B塔移動到C塔,B是源塔,C是目標塔。這個算法達到了預期的目標,即在C塔上按正確的次序疊放了所有的圓形盤子。

3 算法實現

定義結構體plate表示盤子:typedef struct

{ int x,y,xsize,ysize;/*盤子通過繪制橢圓實現,x,y,xsize,ysize確定橢圓的大小*/

int No;/*盤子的編號,編號為0的表示塔柱,大于零的是盤子*/

}plate;

定義一個堆棧zarray來表示塔:typedef struct

{plate p[INIT_SIZE];

int top;/*棧頂*/

int x,y,xof,yof; /*塔的繪制視區*/

}zarray;

用zarray的三個變量A、B、C分別表示三個塔,初始盤子在A塔,設置屏幕繪制區域并相對與繪制區域分別繪制A、B、C三塔、盤子,并在相應盤子的位置標明其編號(編號和盤子一起移動)調用hanoi()函數,并在move()函數中源塔和目標塔的盤子進行繪制。

程序的主要函數由:initZarray(),setLongth(),getplate(),pushplate(),popplate(), outNo(),toDraw(),toDrawZhu(),getn(),hanoi(),move()等組成。

initZarray()負責塔A,B,C數據的初始化, pushplate()負責將盤子壓入目標塔中,并對新壓入的盤子進行繪制,popplate()負責從源塔取下一個盤子,并對源塔進行重新繪制。

1)函數main()的算法

函數main()的算法如圖1,程序執行用戶根據提示輸入合法的n值,根據得到的n值初始化塔A,B,C和n個盤子的大小,設置繪圖視區在屏幕上繪制塔A,B,C和盤子,調用hanoi()函數。

2)函數hanoi()的算法

函數hanoi()的算法如圖1,當程序第一被調用時,源塔A有n個盤子,將塔C作為輔助塔,調用move()函數將源塔A上的n-1個盤子移至塔B上,將源塔A上的編號為n的盤子移到目標塔C,完成將最大盤子移至目標塔C,接下來,將塔B作為源塔有n-1個盤子,塔A作為輔助塔遞歸調用,每次都將源塔上的最大盤子移至目標塔,直到遞歸結束。

3)函數move()的算法

函數move()的算法如圖2,函數的作用就是調用popplate()函數,將源塔出棧重繪,再將出棧的盤子p調用pushplate()函數壓入目標塔,重新繪制。popplate()函數和pushplate()見圖2。

4 結束語

本文深入分析了用遞歸實現漢諾塔的問題,并用圖形仿真程序顯示的盤子的移動過程,對漢諾塔的本質進行了新的剖析,對數據結構的教學有一定的好處。

參考文獻:

[1] 嚴蔚敏,吳偉民.數據結構[M].北京:清華大學出版社,1996.

[2] 王強如.C語言繪圖與計算機仿真技術[M].北京:北京航空航天大學出版社,1995.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281580.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281580.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281580.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring security xml配置詳解

security 3.x <?xml version"1.0" encoding"UTF-8"?> <beans:beans xmlns"http://www.springframework.org/schema/security" xmlns:beans"http://www.springframework.org/schema/beans" xmlns:xsi"http://www…

【Redis源碼分析】Redis命令處理生命周期

運營研發團隊 李樂 前言 本文主要講解服務器處理客戶端命令請求的整個流程&#xff0c;包括服務器啟動監聽&#xff0c;接收命令請求并解析&#xff0c;執行命令請求&#xff0c;返回命令回復等&#xff0c;這也是本文的主題“命令處理的生命周期”。 Redis服務器作為典型的事件…

博鰲直擊 | 區塊鏈在互聯網金融中扮演怎樣的角色?

雷鋒網3月24日報道&#xff0c;今日&#xff08;3月24日&#xff09;&#xff0c;第16屆博鰲亞洲論壇2017年年會在海南繼續進行中。據雷鋒網了解&#xff0c;在今日下午的數字貨幣與區塊鏈分論壇上&#xff0c;中國銀行前行長、中國互聯網金融協會區塊鏈工作組組長李禮輝講述了…

GDB調試qemu-kvm

GDB調試qemu-kvm 前面幾篇博文都是記錄一些kvm相關包編譯安裝及使用&#xff0c;但都沒深入去代碼看看。看源碼在配合上相關原理才能更好的理解kvm。但qemu-kvm的代碼量很多&#xff0c;對我來講直接看源碼收獲甚少&#xff0c;所以找了個調試工具——GDB來配合閱讀代碼。接下來…

c語言編譯錯誤 原文,C語言常見錯誤與警告

C語言常見錯誤與警告C語言常見錯誤與警告C語言常見錯誤&#xff1a;1 invalid type argument of ‘->’ (have ‘struct qstr_xid_element’)這種錯誤一般是沒有理解C中“->”與“.”用法的不同&#xff0c;“->”是指向結構體指針獲取結構體的成員變量時所用&#xf…

力爭營收渠道多樣化,Line 向自拍應用 Snow 投資 4500 萬美元

今年&#xff0c;在科技公司 IPO 市場不景氣的情況下&#xff0c;日本通信應用 Line順利進行了 IPO &#xff0c;目前正在尋求多樣化發展。今天, Line 宣布向自拍應用 Snow 投資 4500 萬美元(500 億韓元)。本次交易之后&#xff0c;Line 將獲得 Snow 25% 的股權。 Snow 常被稱為…

用.NET設計一個假裝黑客的屏幕保護程序

本文主要介紹屏幕保護程序的一些相關知識&#xff0c;以及其在安全方面的用途&#xff0c;同時介紹了如何使用 .NET 開發一款屏幕保護程序&#xff0c;并對核心功能做了介紹&#xff0c;案例代碼開源&#xff1a;https://github.com/sangyuxiaowu/HackerScreenSaver背景前幾天在…

【IntelliJ】IntelliJ IDEA常用設置及快捷鍵以及自定義Live templates

IntelliJ IDEA是一款非常優秀的JAVA編輯器&#xff0c;初學都可會對其中的一些做法感到很別扭&#xff0c;剛開始用的時候我也感到很不習慣&#xff0c;在參考了網上一些文章后在這里把我的一些經驗寫出來&#xff0c;希望初學者能快速適應它&#xff0c;不久你就會感覺到編程是…

復習Javascript專題(一):基本概念部分

一、數據類型 基本類型&#xff1a;Null Boolean String Undefined Number(NB SUN)引用類型&#xff1a;Array Function Object類型判斷&#xff1a;typeof 返回結果"undefined"&#xff08;未定義&#xff09; "boolean"(布爾值) "st…

c語言時鐘報告,C語言圖形時鐘課程設計實驗報告

C語言圖形時鐘課程設計實驗報告 目錄1.系統功能要求。2. 數據結構設計及說明。3.程序結構(畫流程圖) 。4.各模塊的功能。5.試驗結果(包括輸入數據和輸出結果) 。6.體會。7.參考文獻。8.附錄&#xff1a;程序清單及源程序。? 系統功能要求&#xff1a;在屏幕上顯示一個圖形時鐘…

微軟發布 2023 財年第一季度財報:營收達 501 億美元,同比增長 11%

北京時間 2022 年 10 月 26 日——微軟發布 2023 財年第一季度財報。財報顯示&#xff0c;截止到 2022 年 9 月 30 日&#xff1a;營收達到 501 億美元&#xff0c;增長 11%&#xff08;按固定匯率計算增長 16%&#xff09;運營收入為 215 億美元&#xff0c;增長 6%&#xff0…

《圖解CSS3:核心技術與案例實戰》——1.3節漸進增強

本節書摘來自華章社區《圖解CSS3&#xff1a;核心技術與案例實戰》一書中的第1章&#xff0c;第1.3節漸進增強&#xff0c;作者 大漠&#xff0c;更多章節內容可以訪問云棲社區“華章社區”公眾號查看 1.3 漸進增強第一次聽到“漸進增強”&#xff08;Progressive Enhancement…

阿里云云主機搭建網站攻略 - 云翼計劃

阿里云服務器&#xff08;云主機&#xff09;搭建網站攻略 - 云翼計劃 提示&#xff1a;此搭建攻略為2017版本&#xff0c;阿里云未跟新前。 最新搭建攻略請前往 Amaya丶夜雨博客 / 最新個人博客 https://www.amayaliu.cn 支持一下哦&#xff0c;謝謝。&#xff08;9.5一…

用c語言遞歸函數做掃雷,【C語言基礎學習---掃雷游戲】(包含普通版+遞歸煉獄版)...

/*******************///以下是源文件game.c內容/*******************/#include"game.h"//初始化棋盤的實現void InitBoard(char board[ROWS][COLS], int rows, int cols, char set){int i 0;int j 0;for (i 0; i < rows; i){for (j 0; j < cols; j){board…

記一次 .NET 某醫療器械 程序崩潰分析

一&#xff1a;背景 1.講故事前段時間有位朋友在微信上找到我&#xff0c;說他的程序偶發性崩潰&#xff0c;讓我幫忙看下怎么回事&#xff0c;上面給的壓力比較大&#xff0c;對于這種偶發性崩潰&#xff0c;比較好的辦法就是利用 AEDebug 在程序崩潰的時候自動抽一管血出來&a…

1251: 字母圖形 [水題]

1251: 字母圖形 [水題] 時間限制: 1 Sec 內存限制: 128 MB提交: 140 解決: 61 統計題目描述 利用字母可以組成一些美麗的圖形&#xff0c;下面給出了一個例子&#xff1a; ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 這是一個5行7列的圖形&#xff0c;請找出這個圖形的規律&…

c語言 三角形三邊abc,C語言代碼輸入abc三個數,求一這3個數為邊長的三角形面積...

2011-01-04 回答#include #include #include #include #include int main(){float a 0.0;float b 0.0;float c 0.0;float s 0.0;double area 0.0;while(true){printf("input your date(a,b,c):");scanf("%f%f%f",&a,&b,&c);if(!isdigit((…

shell腳本中向hive動態分區插入數據

在hive上建表與普通分區表創建方法一樣&#xff1b; 1 CREATE TABLE dwa_m_user_association_circle(2 device_number string, 3 oppo_number string, 4 prov_id_oppo string, 5 area_id_oppo string, 6 dealer_oppo string, 7 short_call_nums bigint, 8 long3…

WPF效果第二百零二篇之TreeView帶連接線

前面文章中分享了TreeView支持多選;然而在項目上使用時,領導覺得不滿意:體現不了真正的從屬關系;既然領導都發話了;那就開整就行了;今天就再來個帶有連接線的TreeView效果:1、來看看TreeViewItem的Template:2、展開和收縮動畫:3、參考資料https://www.codeproject.com/tips/673…

ObjectTive C語言語法,[譯]理解 Objective-C 運行時(下篇)

本文來自網易云社區作者&#xff1a;宋申易所以到底 objc_msgSend 發生了什么&#xff1f;很多事情。看一下這段代碼&#xff1a;[self printMessageWithString:"Hello World!"];這實際上被編譯器翻譯成&#xff1a;objc_msgSend(self, selector(printMessageWithStr…