版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、安徽工程大學(xué) 信息10課程設(shè)計馬踏棋盤的求解及演示設(shè)計摘 要數(shù)據(jù)結(jié)構(gòu)是計算機科學(xué)與技術(shù)專業(yè)的一門核心專業(yè)基礎(chǔ)課程,是一門理論性強、思維抽象、難度較大的課程。我認(rèn)為學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的最終目的是為了獲得求 解問題的能力。對于現(xiàn)實世界中的問題,我們應(yīng)該能從中抽象出一個適當(dāng)?shù)臄?shù)學(xué) 模型,該數(shù)學(xué)模型在計算機內(nèi)部用相應(yīng)的數(shù)據(jù)結(jié)構(gòu)來表示,然后設(shè)計一個解此數(shù)學(xué)模型的算法,再進(jìn)行編程調(diào)試,最后獲得問題的解答。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計是計算機科學(xué)技術(shù)專業(yè)集中實踐性環(huán)節(jié)之一, 是學(xué)習(xí)完數(shù)據(jù)結(jié)構(gòu)課程后進(jìn)行 的一次全面的綜合練習(xí)。開設(shè)本課程設(shè)計實踐的主要目的就是要達(dá)到理論與實際 應(yīng)用相結(jié)合,提高學(xué)生的動手能力,完成計算機應(yīng)用能力的
2、培養(yǎng);本課程設(shè)計主 要解決馬踏棋盤的問題,找出踏遍棋盤的多種路徑,并實現(xiàn)動態(tài)要是過程。馬踏棋盤問題,實際上是圖論中的哈密頓通路問題,是 典型的np問 題,求解的問題與算法設(shè)計有很大關(guān)系,如果采取窮舉搜索的話,很容易 陷入海量搜索的狀態(tài),耗費巨大的時間,使問題幾乎不可解,因此馬在棋盤上遍 歷采用算法當(dāng)中的深度優(yōu)先算法和 啟發(fā)式貪心算法,用棧來存儲遍歷過程,通過 對棧的使用實現(xiàn)對所有路徑的搜索。 在調(diào)試過程發(fā)現(xiàn),啟發(fā)式貪心算法,針對于 馬踏棋盤問題有著極大的好處,就是無論從棋盤上哪個點開始,找到一條遍歷完 棋盤的通路是不需要回溯的,也就節(jié)省了大量的時間,而試探性的操作對于每個 點都也只有168步,
3、所以求出所有路徑在 不到一秒的時間內(nèi)完成。關(guān)鍵詞:馬踏棋盤;騎士周游;哈密頓通路;np-完全問題;貪心算法;回溯法;馬踏棋盤的求解及演示設(shè)計 目錄第一章引 言第二章需求分析2.1問題描述2.2基本要求2.3具體需求2.4開發(fā)環(huán)境第三章概要設(shè)計3.1系統(tǒng)概述3.2系統(tǒng)描述3.3邏輯設(shè)計第四章詳細(xì)設(shè)計4.1 功能模塊設(shè)計4.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計4.3算法設(shè)計第五章調(diào)試與分析5.1調(diào)試分析第六章系統(tǒng)試用說明6.1系統(tǒng)試用說明第七章總結(jié)與體會錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤
4、!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽 錯誤!未定義書簽參考文獻(xiàn)3第一章引 言本課程設(shè)計主要研究馬踏棋盤的問題, 即騎士周游問題,是將馬隨機放在國際象棋的8x8棋盤的某個方格中,“馬”按照走棋規(guī)則進(jìn)行移動,要求每個方格只進(jìn)入一次,走遍棋盤上全部64個方格。許多知名的數(shù)學(xué)家,如德莫弗 (de moivre)、歐拉(euler)與范德蒙德(vandermonde)等人,在過去的200年中都研究過這個問題, 今天從數(shù)據(jù)結(jié)構(gòu)的角度,
5、解決這一問題。力求以最快的速度,即最高的效率來解決問題。已知窮舉法是幾乎不可能完成的, 而與解決迷宮問題的回溯法, 也要占用大量的時間, 這里采用貪心 算法來解決這一問題,并找出多有的遍歷路徑。4第二章需求分析2.1問題描述馬隨機放在國際象棋的8x8棋盤的某個方格中,“馬”按照走棋規(guī)則 進(jìn)行移動,要求每個方格只進(jìn)入一次,走遍棋盤上全部64個方格。設(shè)計一個國際 象棋的馬踏遍棋盤的演示程序。2.2基本要求設(shè)計合適的數(shù)據(jù)結(jié)構(gòu),編制遞歸以及非遞歸程序,求出馬的行走路線,并按求 出的馬的行走路線,將路線1,2, , ,64依次填入一個8x 8的方陣,輸出之,若有 多種走法,則能將全部的輸出。必須要能夠?qū)?/p>
6、踏遍棋盤的過程顯示在計算機屏幕 上。要求:(1) 描述設(shè)計所涉及的數(shù)據(jù)模型,設(shè)計高效的數(shù)據(jù)結(jié)構(gòu)完成總體設(shè)計,搭好框架,確定人機對話的界面(要求界面上能動態(tài)體現(xiàn)出演示的過程),實現(xiàn)功能;(2) 界面友好,函數(shù)功能要劃分好(3) 要有算法設(shè)計的流程圖(4) 程序要加必要的注釋(5) 要提供程序測試方案2.3具體需求1、首先要找到馬踏棋盤棋盤的多條路徑。2 、實現(xiàn)馬踏棋盤的動態(tài)演示過程。3 、優(yōu)化算法,提高算法效率,以遞歸與非遞歸的方式實現(xiàn)2.4開發(fā)環(huán)境開發(fā)環(huán)境:win dows 8輔助工具:visual studio 2012 ,myeclipse 10.5運行環(huán)境:win dows xp/vis
7、ta/7/8第三章概要設(shè)計3.1系統(tǒng)概述3.12 主函數(shù)main()的執(zhí)行流程求解多條路徑子系統(tǒng):自動演示路徑子系統(tǒng)開始3.2系統(tǒng)描述通過vs2012完成的尋找多條路徑的子系統(tǒng),通過java來實現(xiàn)馬踏棋盤的動態(tài)演示子系統(tǒng)。在尋找多條路徑的子系統(tǒng)中,通過啟發(fā)式貪心算法,將某點的下一步最少通往其它落 腳點,將該點確定為最佳落點。每次只走下一步通向其他點最少的點。用棧記錄探尋的過程,將走過的點標(biāo)記為1,試探而沒有走的點標(biāo)記為 0.最后通過尋找出棧標(biāo)志為0的點來尋找其他路徑。在動態(tài)顯示模塊式通過java的線程機制是先的自動動畫演示。3.3邏輯設(shè)計抽象數(shù)據(jù)類型棋盤上某點的位置坐標(biāo)結(jié)構(gòu)體posti on把
8、個方向試探的增量位置數(shù)組direct8棋盤某點通向其他點的可到達(dá)數(shù)的二位數(shù)組access88鏈棧用來記錄可到達(dá)下一位置坐標(biāo)的數(shù)組:nextpath8;用來記錄整個遍歷過程的數(shù)組:tourpos64;第四章詳細(xì)設(shè)計4.1功能模塊設(shè)計4.1.2創(chuàng)建模塊本模塊創(chuàng)建棋盤,以及棋盤上每一點的可到達(dá)數(shù),一個向8個方向試探的增量數(shù)組。以及記錄整個遍歷流程的鏈棧。選擇或設(shè)計數(shù)據(jù)結(jié)構(gòu)的存儲結(jié)構(gòu),實現(xiàn)存儲結(jié)構(gòu)的基本運算、設(shè)計的模塊構(gòu) 成、各模塊的簡要說明、流程圖、調(diào)用關(guān)系表等。在這個過程中,要綜合考慮系 統(tǒng)功能,使得系統(tǒng)結(jié)構(gòu)清晰、合理、簡單和易于調(diào)試,抽象數(shù)據(jù)類型的實現(xiàn)盡可 能做到數(shù)據(jù)封裝,基本操作的規(guī)格說明盡可
9、能明確具體。 詳細(xì)設(shè)計的結(jié)果是對數(shù) 據(jù)結(jié)構(gòu)和基本操作作出進(jìn)一步的求精,寫出數(shù)據(jù)存儲結(jié)構(gòu)的類型定義,寫出函數(shù) 形式的算法框架。4.1.3操作模塊實現(xiàn)對棋盤的周游,并找到多條路徑4.1.4顯示模塊將找到的所有路徑顯示在屏幕上,并統(tǒng)計找到的路徑數(shù)。4.1.5自動演示模塊通過java的applet和線程機制,實現(xiàn)對找到的路徑進(jìn)行動態(tài)演示4.2數(shù)據(jù)結(jié)構(gòu)設(shè)計4.2.1數(shù)據(jù)設(shè)計posti on定義棋盤上某點的位置坐標(biāo)結(jié)構(gòu)體typedef structint x;int y; postion ;定義把個方向試探的增量位置數(shù)組jqk-00l-qiira-qg-q,-1,-2,-2,-1,-1,2,-2,1;po
10、stion direct8=1,2,2,1,2,-1,1,-2定義棋盤某點通向其他點的可到達(dá)數(shù)的二位數(shù)組int access88 = 2,3,4,4,4,4,3,2,3,4,6,6,6,6,4,3,4,6,8,8,8,8,6,4,4,6,8,8,8,8,6,4,4,6,8,8,8,8,6,4,4,6,8,8,8,8,6,4,3,4,6,6,6,6,4,3,2,3,4,4,4,4,3,2;定義一個以 某一棋盤上的點和標(biāo)志的類型,作為棧的存儲數(shù)據(jù)typedef struct datatype data; struct node *n ext; stacknode,* pstacknode;/typ
11、edef struct / 定義一個棧pstacknode top; linkstack ,* plinkstack ;用來記錄可到達(dá)下一位置坐標(biāo)的數(shù)組:postion nextpath8;用來記錄整個遍歷過程的數(shù)組:postion tourpos64;4.3算法設(shè)計開始尋找下一條路徑: 流程圖:略:算法描述:應(yīng)考察每一方格的可到達(dá)性。使用數(shù)組accessibility 表示可達(dá)到數(shù),并當(dāng)馬踏棋盤時,程序動態(tài)修正剩余格子的可達(dá)到數(shù)。accessibility arraypos = 0表明 格子已經(jīng)被占據(jù)。算法:void next_path( postion p)|postion testpos
12、;for ( int i = 0 ; i < 8 ; i+ )/有八種到達(dá)的情況testpos.x =p.x + direct i .x;/ 得岀 x,y坐標(biāo)的測試位置testpos.y =p.y + direct i .y;if (checkpath(testpos)/判斷測試位置是否在棋盤內(nèi)nextpatharraypos=testpos ;/由測試位置給岀正確x,丫坐標(biāo)accessibility arraypos = access testpos.xtestpos.y;/ 利用對應(yīng)/結(jié)束for循環(huán),尋找結(jié)束countaccessibility = arraypos ;/ 統(tǒng)計可達(dá)到
13、數(shù)的x,y坐標(biāo)得岀相應(yīng)的可到達(dá)的路徑總數(shù)if(accessibility arraypos > 0 )/ accessibility arraypos = 0表明格子已經(jīng)被占據(jù)arraypos + ;/尋找空格子結(jié)束/2.使用冒泡法來查詢最小數(shù)。void sortall () |/冒泡排序法.冒泡排序的基本概念是:依次比較相鄰的兩個數(shù),將大數(shù)放在前面,小數(shù)放在后面。/保持穩(wěn)定性int temp;postion temps;for ( int i = 0 ; i < countaccessibility - 1 ; i + )for ( int j = i + 1; j < c
14、ountaccessibility ; j + )if ( accessibility i > accessibility j )temps=n extpathi;n extpathi=nextpathj;n extpathj=temps;temp = accessibility i ;accessibility i = accessibility j ;accessibility j = temp;/end of if/ end of inner for/ end of outer for / end of sortall3./3、向下一步移動,將當(dāng)前要走的結(jié)點入棧,標(biāo)記為 1其他可到
15、達(dá)但沒有走的點入棧,標(biāo)記為 0 如果當(dāng)前坐標(biāo)走過,那么它可以到達(dá)的其它點的可到達(dá)數(shù)應(yīng)該-1最后將該點的可到達(dá)數(shù)更新為0void domoving( postion p)for ( int i = 0 ; i < countaccessibility ; i + ) ,datatype q;q.p=n extpathi;if (i=0)push li nkstack(s,q);access n extpathi.x n extpathi.y -;/直到?jīng)]有路徑了accessp.x p.y = 0 ;/ 當(dāng)前位置置 04、打印路徑:打印8x8棋盤,在棋盤中顯示馬跳的步驟:void fprin
16、t()/輸出路徑int order88=0;ii-初始化for (int k=0;k<64;k+)ordertourposk.xtourposk.y=k;cout« "n棋盤表示n"cout<< "01234567n"coutvv"+-+-+-+-+-+-+-+-+n"for (int i=0;i<8;i+)pri ntf(" " );pri ntf("%2d",i);for (int j=0;j<8;j+)printf("| %2d "
17、; ,orderij);pri ntf("|");pri ntf("n");if (i=7)pri ntf("+");elsepri ntf("+");printf("n");pri ntf(" " );5、尋找其他路徑:算法描述:將棧中存儲的路徑岀棧,判斷標(biāo)記是否為 0,并累計標(biāo)記為1的個數(shù)count next,即走過的 步數(shù),方便撤銷走過的步驟,根據(jù) count_next來撤銷走過的步驟,先將在 access叩 撤銷,即還原 為1,將當(dāng)前為flag為0的復(fù)制到下一步的to
18、urpos數(shù)組中,之后將tourpos后面的步驟還原為 0,再結(jié)束后,在尋找下一條路徑,若找不到,則繼續(xù)岀棧,向前回溯。void other path()/尋找其他路徑int count=0;int recount=0,coutpath=0,count next=0;datatype ps169;while (!empty_linkstack(s) int flag=0;pop_li nkstack(s,&pscou nt);if (pscount.flag!=o)cou nt_n ext+;if(pscou nt.flag=0)access tourpos63-cou nt_n ex
19、t.xtourpos63-cou nt_n ext.y=1;tourpos63-cou nt_n ext=pscou nt.p;for (int i=0;i<count_next;i+)access tourpos63-i.xtourpos63-i.y=1;tourpos63-i.x=0;tourpos63-i.y=0;access tourpos63-cou nt n ext.xtourpos63-cou nt n ext.y=o; for (int j=count_next;j>0;j-)if (! tour_next( tourpos63-j,63-j)flag=1;brea
20、k;if (flag!=1)coutpath+;fprin t();cou nt+;cout«e ndl;coutvv "周游結(jié)束共找到"vvcoutpath+1 << "條路徑"<<endl;動態(tài)演示:根據(jù)java線程機制,每隔800毫秒動畫演示1步。public void run() /啟動線程后將自動調(diào)用run ()方法,在run ()方法內(nèi)產(chǎn)生一個控制動畫的循環(huán) int delay = 800;while (true )count = 0;for (int i=0;i<64;i+)repaint();/re
21、paint()將調(diào)用 paint()方法畫一幀圖像count +;if (recount >63) final frame from= new frame();joptionpane. showmessagedialog (from,"周游完成”); return ;try thread.sleep (delay);catch (excepti on e) 第五章調(diào)試與分析5.1調(diào)試分析經(jīng)過對程序的編制,調(diào)試和運行,使我更好的掌握了?;拘再|(zhì)和有關(guān)馬的遍歷問題 的解決方法,熟悉了各種調(diào)用的數(shù)據(jù)類型, 在調(diào)試和運行過程中使我更加的了解和熟悉程序 運行的環(huán)境,提高了我對程序調(diào)試分析
22、的能力和對錯誤的糾正能力。5.1.1、首先要檢測貪心算法的可用性,先找出一條路徑;檢測輸出的路徑是否合法5.1.2、完成一條路徑的輸出之后,進(jìn)行棧的檢查,檢查棧中存儲的元素是否正確能否滿足回溯的標(biāo)準(zhǔn),經(jīng)過檢測棧的合法性才能對棧中元素進(jìn)行操作,最后就是,實現(xiàn)對其他路徑的尋找,并統(tǒng)計路徑的條數(shù)。第六章系統(tǒng)試用說明6.1系統(tǒng)試用說明系統(tǒng)提示用戶輸入測試坐標(biāo), 輸入坐標(biāo)應(yīng)滿足 必須為整數(shù),且大于等于0,小于8兩 點之間以空格隔開。及滿足在棋盤上點的的要求。測試數(shù)據(jù):0 0 ; 1 0; 7 7,2 3第七章總結(jié)與體會通過本次課程設(shè)計掌握了關(guān)于數(shù)據(jù)結(jié)構(gòu)的很多內(nèi)容如算法的設(shè)計,棧的使用,對圖的深度優(yōu)先遍歷
23、算法有了更深入的了解, 對于馬踏棋盤這一問題,有了 獨到研究和見解,讓學(xué)習(xí)的理論與實際應(yīng)用相結(jié)合, 提高了我的動手能力,以及 獨立解決問題的能力,如使用 java來動態(tài)演示馬踏棋盤的步驟,本來學(xué)習(xí) java 是對于用于動畫的線程機制就沒有深入了解, 經(jīng)過這次的課程設(shè)計,在網(wǎng)上查閱 資料,在幾天內(nèi),我學(xué)會了如何使用 java的線程機制來實現(xiàn)動畫演示程序,可 對以說是一個不小的受獲。對數(shù)據(jù)結(jié)構(gòu)的應(yīng)用上也得到很大的提升, 前面做實驗 都是一些驗證性的實驗,只是把書上的代碼輸進(jìn)去,檢測它的正確性,和它的算 法思想,而這次是在問題的前提下,來確定數(shù)據(jù)結(jié)構(gòu),在算法思想的前提下,來 確定算法的使用,并根據(jù)各
24、種可行的算法來確定最優(yōu)的算法,即時空效率最高。 并且在寫出解決查找多種路徑的算法后, 很有成就感,因為在網(wǎng)上,這一問題只 有求出一條路徑的方法,也沒有動態(tài)演示的,很不符合課程設(shè)計的要求,并且發(fā) 現(xiàn),如果只找一條路徑的話,要是算法用的靈活,可以說沒學(xué)數(shù)據(jù)結(jié)構(gòu)之前也可 解決,所以在找到所有路徑的時候內(nèi)心很喜悅, 大概這就是編程的樂趣吧。本次 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計確實收益匪淺。參考文獻(xiàn)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx參考文獻(xiàn)書寫格式應(yīng)符合gb7714-87文后參考文獻(xiàn)著錄規(guī)則。常用參考 文獻(xiàn)編寫項目和順序規(guī)定如下:先安排中文(按姓氏筆劃排序),后安排
25、英語(或其他語種)(按字母先后排列);注釋置于頁腳,參考文獻(xiàn)置于文末。參考文獻(xiàn)只列出最主要的、且是公開發(fā) 表的文獻(xiàn),非正式公開發(fā)表的資料不列。文獻(xiàn)主要類型格式如下:期刊:序號作者篇名j.17附錄/ np_compelte.cpp :定義控制臺應(yīng)用程序的入口點/ np_compelte.cpp :定義控制臺應(yīng)用程序的入口點。/#i nclude "stdafx.h" #include <iostream> using namespacestd; #defi ne max100typedef struct direct_ in creme nt direct_ in
26、 creme ntdirect_ay8=1,2,2,1,2,-1,-1,-2,-2,-1,1,-2,-1,2,-2,1;int access88 = 2,3,4,4,4,4,3,2,3,4,6,6,6,6,4,3,4,6,8,8,8,8,6,4,4,6,8,8,8,8,6,4,4,6,8,8,8,8,6,4,4,6,8,8,8,8,6,4,3,4,6,6,6,6,4,3,2,3,4,4,4,4,3,2;int accessibility;int countaccessibility;typedef structint x;int y; postion ;staticpostion nextpa
27、th8;staticpostion tourpos64;staticint arraypos=0;staticint own accessibility ;/當(dāng)前棋子的可到達(dá)數(shù)static int cou ntmov in g=-1;bool success = false ;/typedef struct postion p;int flag; datatype;typedef structnode /定義結(jié)點結(jié)構(gòu)datatype data; struct node *n ext; stacknode,* pstacknode;/typedef struct / 定義一個棧pstacknod
28、e top; linkstack ,*plinkstack;/plinkstack init_linkstack() / 初始化函數(shù) 一plinkstack s;s=( plinkstack ) new( linkstack );if (s)s->top->n ext=nullreturn (s);j/bool empty_linkstack( plinkstack s) 判斷??蘸瘮?shù)return ( s>top= null;/int push_linkstack( plinkstack s, datatype x) / 入棧函數(shù) 一pstacknode p;p= new (
29、 stacknode);if (!p)return 0;p->data= x;p>n ext= s>top;int pop_linkstack( plinkstack s,datatype * x) / 岀棧函數(shù)pstacknode p;if (empty linkstack( s)p=s>top;s>top= s>top->n ext;delete (p);return 1;/int gettop_linkstack( plinkstack s, datatype *x) 取棧頂元素if (empty linkstack( s)return 0;el
30、se/void destroy_linkstack(plinkstack * ls) / 銷毀棧函數(shù)pstacknode p,q;if (* ls)p=(* ls)->top;while (p)q=p;p=p->n ext;delete (q);delete (* ls);*ls=nullreturn ;plinkstack s=init_linkstack();/bool checkpath( postion p)/判斷測試位置是否在棋盤內(nèi)if (p.x>=0&&p.x<8&&p.y>=0&&p.y<8) r
31、eturn true ;elsereturn false ;/void sortall ()/冒泡排序法.冒泡排序的基本概念是:依次比較相鄰的兩個數(shù),將大數(shù)放在前面,小數(shù)放在后面。/保持穩(wěn)定性int temp;postion temps;for ( int i = 0 ; i < countaccessibility - 1 ; i + )for (int j = i + 1; j < countaccessibility ; j + )if(accessibility i > accessibility j )temps=n extpathi;n extpathi=next
32、pathj;n extpathj=temps;temp = accessibility i ;accessibility i = accessibility j ;accessibility j = temp; /end of if/ end of inner for/ end of outer for / end of sortall/void next_path(posti on p)postion testpos;for ( int i = 0 ; i < 8 ; i+ )/有八種到達(dá)的情況testpos.x =p.x + direct ay i .dx;/ 得岀 x,y坐標(biāo)的測試
33、位置testpos.y =p.y + direct_ay i .dy;if (checkpath(testpos)/判斷測試位置是否在棋盤內(nèi)nextpatharraypos=testpos ;/由測試位置給岀正確x,丫坐標(biāo)accessibility arraypos = access testpos.xtestpos.y;/ 利用對應(yīng)的x,y坐標(biāo)得岀相應(yīng)的可到達(dá)的路徑總數(shù)if (accessibility arraypos > 0 )/ accessibility arraypos = 0表明格子已經(jīng)被占據(jù)arraypos + ;/尋找空格子結(jié)束/結(jié)束for循環(huán),尋找結(jié)束countacc
34、essibility = arraypos ;/ 統(tǒng)計可達(dá)到數(shù)if (countaccessibility > 0 )arraypos = -1 ;/bool hasmorepath()/ arraypos + 1指向下一個可行的if ( (arraypos + 1 ) < countaccessibility)return true ;elsereturn false ; / hasmoreaccessible()方法結(jié)束/void nextaccessible()arraypos + ;/void domioving( postion p)for ( int i = 0 ; i
35、 < countaccessibility ; i + )datatype q;q.p=n extpathi;if (i=0) q.flag=1;if (countaccessibility>1)q.flag=2; elseq.flag=0;push li nkstack(s,q);access n extpathi.x n extpathi.y -; =/直到?jīng)]有路徑了accessp.x p.y = 0 ;/ 當(dāng)前位置置 0/void undomoving( postion p)/撤消移動操作for ( int i = 0 ; i < countaccessibility
36、; i + )accessp.x p.y = own accessibility ;/void tour( postion p)cou ntmov ing + ;/如果64個格子都被走過,則返回if (countmoving = 63 ) tourpos cou ntmov ing .x=p.x ;tourpos cou ntmov ing .y =p.y ;success =true ;cou ntmov ing -;returnnext_path( p);/初試化 accessiblesquares 對象,給nextsquare分配內(nèi)存while (hasmorepath()/ 利用 ac
37、cessiblesquares() 對象調(diào)用 hasmoreaccessible() 成員函數(shù)/開始移動domoving( p); / 調(diào)用 nextsquare.domoving()函數(shù)/把這一步記錄下來tourpos cou ntmov ing .x=p.x ;tourpos cou ntmov ing .y =p.y ;/嘗試下一步的移動n extaccessible();tour ( n extpatharraypos);/如果64個格子都被走過,則返回if ( success ) cou ntmov ing -;return ;cou ntmov ing -;/void fprint
38、()/輸出路徑int order88=0;/-初始化for (int k=0;k<64;k+)ordertourposk.xtourposk.y=k;cout<< "n棋盤表示 n"cout«"0123 45 67n"cout«"for (int i=0;i<8;i+)printf("");pri ntf("%2d",i);for (int j=0;j<8;j+)printf("| %2d " ,orderij);pri ntf(&qu
39、ot;|");pri ntf("n");if (i=7)pri ntf(i!-+ " );elsepri ntf(i!+-+-+-+-+-+-+-+ " );pri ntf("n");printf("");/bool tour_next(postion p int j) _postion testpos;int count =0;for ( int i = 0 ; i < 8 ; i+ )/有八種到達(dá)的情況testpos.x =p.x + direct_ay i .dx;/ 得岀 x,y坐標(biāo)的測試位置testpos.y =p.y + direct ay i .dy;if (checkpath(testpos)/判斷測試位置是否在棋盤內(nèi)if ( access testpos.xtestpos.y!=o)/ 利用對應(yīng)的 x,y坐標(biāo)得岀相應(yīng)的可
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《海岸風(fēng)光模板》課件
- 水準(zhǔn)測量外業(yè)工作要點
- 贛南醫(yī)學(xué)院《生物化學(xué)與分子生物學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 勞動防護(hù)用品培訓(xùn)課件
- 身體解剖培訓(xùn)課件
- 2022年上海統(tǒng)計師(中級)《統(tǒng)計基礎(chǔ)理論及相關(guān)知識》考試題庫及答案
- 甘孜職業(yè)學(xué)院《園林工程實驗》2023-2024學(xué)年第一學(xué)期期末試卷
- 三年級數(shù)學(xué)上冊1時分秒單元概述和課時安排素材新人教版
- 三年級數(shù)學(xué)上冊第三單元測量第4課時千米的認(rèn)識教案新人教版
- 小學(xué)生校園安全教育制度
- 現(xiàn)代營銷學(xué)原理課件
- 德語語言學(xué)導(dǎo)論智慧樹知到期末考試答案2024年
- 拒絕早戀主題班會 課件(34張)2023-2024學(xué)年主題班會
- 離婚協(xié)議書完整版Word模板下載
- 招標(biāo)代理機構(gòu)內(nèi)部監(jiān)督管理制度
- 初中周末安全教育課件
- 2024年度醫(yī)院骨肌肉康復(fù)科醫(yī)務(wù)人員述職報告課件
- 小學(xué)四年級綜合實踐活動《羊毛氈化制作》教學(xué)公開課課件
- 工藝工程師述職報告
- 2024北京西城區(qū)初二(上)期末英語試卷及答案
- 小學(xué)生思維漫畫合輯
評論
0/150
提交評論