




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、合肥學(xué)院計算機(jī)科學(xué)與技術(shù)系課程設(shè)計報告20122013 學(xué)年第 2 學(xué)期課程課程 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計名稱課程設(shè)計名稱馬踏棋盤學(xué)生姓名學(xué)生姓名學(xué)號學(xué)號專業(yè)班級專業(yè)班級指導(dǎo)教師指導(dǎo)教師2013 年 6 月計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 1 -目目 錄錄數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告馬踏棋盤.- 2 -問題描述.- 2 -1、問題分析與定義.- 2 -2、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計.- 3 -數(shù)據(jù)結(jié)構(gòu)的選擇 .- 3 -概要設(shè)計 .- 3 -3、詳細(xì)設(shè)計和編碼.- 4 -4、上機(jī)調(diào)試過程.- 6 -5、測試結(jié)果及分析.- 7 -6、用戶使用說明.- 9 -7、參考文獻(xiàn).- 9 -附錄源程序.- 10 -計科系
2、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 2 -數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告馬踏棋盤馬踏棋盤題目:題目:【問題描述】設(shè)計一個國際象棋的馬踏遍棋盤的演示程序。要求:將馬隨機(jī)放在國際象棋的 88 棋盤 Board88的某個方格中,馬按走棋規(guī)則進(jìn)行移動。要求每個方格只進(jìn)入一次,走遍棋盤上全部 64 個方格。編制非遞歸程序,求出馬的行走路線,并按求出的行走路線,將數(shù)字 1,2,64 依次填入一個 88 的方陣,輸出之。1 1、問題分析與定義、問題分析與定義走棋規(guī)則:馬走 32 格對角線,簡單的說就是走 L 形棋盤如圖所示,將馬放在棋盤中的任意一個位置,按照馬的走棋規(guī)則,我們能夠發(fā)現(xiàn),如果沒有其他棋子的影響,
3、它最多有 8 個出口,最少有 2 個出口。馬所在位置及其出口算法核心思想:本程序的核心算法是“貪心算法” 。在每個結(jié)點對其子結(jié)點進(jìn)行選取時,優(yōu)先選擇出口最小的進(jìn)行搜索, 出口的意思是在這些子結(jié)點中它們的可行子結(jié)點的個數(shù),也就是孫子結(jié)點越少的越優(yōu)先跳,為什么要這樣選取,這是一種局部調(diào)整最優(yōu)的做法,如果優(yōu)先選擇出口多的子結(jié)點,那出口少的子結(jié)點就會越來越多,很可能出現(xiàn)死結(jié)點(顧名思義就是沒有出口又沒有跳過的結(jié)點) ,這樣對下面的搜索純粹是徒勞,這樣會浪費很多無用的時間,反過來如果每次都優(yōu)先選擇出口少的結(jié)點跳,那出口少的結(jié)點就會越來越少,這樣跳成功的機(jī)會就更大一些。 012345670 8 1 1 7
4、 2 2 H 3 6 3 4 5 4 5 6 7 計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 3 -2 2、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計數(shù)據(jù)結(jié)構(gòu)的選擇棧:本程序可以利用棧的知識來解決,當(dāng)然,棧也包括鏈棧和順序棧,由于本程序數(shù)據(jù)有限,并且順序棧較鏈棧簡單,所以該程序最終選擇使用順序棧來解決。貪心算法:在算法中采用逐步構(gòu)造最優(yōu)解。在每個階段,都作出一個看上去最優(yōu)的決策(在一定的標(biāo)準(zhǔn)下) 。決策一旦作出就不可再更改。概要設(shè)計、主程序模塊:void main()定義變量;接受命令;處理命令;退出;、起始坐標(biāo)函數(shù)模塊馬兒在棋盤上的起始位置;、探尋路徑函數(shù)模塊馬兒每個方向進(jìn)行嘗試,直到試完整個棋盤
5、;、輸出路徑函數(shù)模塊輸出馬兒行走的路徑; 流程圖如下: 輸入的初始位置是否正確 否 是 主程序模塊起始坐標(biāo)函數(shù)模塊探尋路徑函數(shù)模塊 輸出路徑函數(shù)模塊塊 結(jié)束計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 4 - 3 3、詳細(xì)設(shè)計和編碼、詳細(xì)設(shè)計和編碼下圖顯示了馬位于方格(2,3)時,8 個可能的移動位置。一般來說,當(dāng)馬位于位置(i,j)時,可以走到下列 8 個位置之一012345670811722H373454567(i-2,j+1)、 (i-1,j+2) 、(i+1,j+2)、(i+2,j+1)(i+2,j-1)、(i+1,j-2)、(i-1,j-2)、(i-2,j-1) 但是,如果(i,j)靠近棋盤的邊緣,
6、上述有些位置可能超出棋盤范圍,成為不允許的位置。8 個可能位置可以用兩個一維數(shù)組 Htry10.7和 Htry20.7來表示: 0 1 2 3 4 5 6 7Htry1 -2 -1 1 2 2 1 -1 -2 0 1 2 3 4 5 6 7Htry2 1 2 2 1 -1 -2 -2 -1位于(i,j)的馬可以走到的新位置是在棋盤范圍內(nèi)的(i+Htryh,j+Htry2h),其中h=0,1,2,7。每次在多個可走位置中選擇其中一個進(jìn)行試探,其余未曾試探過的可走位置必須用適當(dāng)結(jié)構(gòu)妥善管理,以備試探失敗時的“回溯”(悔棋)使用。計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 5 -流程圖如下:開始Int i、ji=
7、0iNBoardij=0i +輸入棋子起始位置判斷棋子是否出棋盤MultiplexFor 循環(huán)從這個位置開始結(jié)束計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 6 -4 4、上機(jī)調(diào)試過程、上機(jī)調(diào)試過程(1) 、本次實驗的主要目的是在于掌握和理解棧的特性和它的應(yīng)用。在編制該程序中遇到了很多問題。首先,在開始剛編制程序的時候遇到的問題是,程序編譯都通不過,主要在一些細(xì)節(jié)的問題上,還有在程序的返回值在剛開始時也沒有正確返回。經(jīng)過編譯慢慢調(diào)試,編譯都能通過,沒有錯誤和警告。(2) 、雖然編譯都能通過,但是運行時卻出錯,程序不能終止,只有通過人工方式結(jié)束程序,可能是在某些地方出現(xiàn)了無限死循環(huán)了,然后在仔細(xì)檢查代碼,發(fā)現(xiàn)沒
8、有標(biāo)記馬兒嘗試的方向 director,這樣的話,馬兒回溯的時候,下一次又有可能走那個方向,這樣就出現(xiàn)了死循環(huán)。(3) 、標(biāo)記好馬兒嘗試的方向后,編譯運行,但是運行結(jié)果卻不符合程序所要求的結(jié)果,說明在算法上肯定有錯誤,檢查發(fā)現(xiàn),馬兒走的坐標(biāo)沒有控制后,它的橫縱坐標(biāo)必須控制 0 到 7 之間,否則的話馬兒就會踏出棋盤以外,這樣輸出的結(jié)果就不對。還有就是棋盤走過的位置要標(biāo)記一下,以便下次走不重復(fù)走,當(dāng)回溯的時候的記得把標(biāo)記給清掉,這個地方有時候也很容易混淆。5 5、測試結(jié)果及分析、測試結(jié)果及分析輸入數(shù)據(jù) 1:根據(jù)要求重新輸入馬的初始位置(9,9) ,由于輸入數(shù)據(jù)不再要求范圍之內(nèi),程序要求用戶重新輸
9、入;圖(1)計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 7 -輸入數(shù)據(jù) 2:根據(jù)要求重新輸入馬的初始位置(1,1) ,結(jié)果如下圖(2)= =圖(3)計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 8 -測試結(jié)果如圖(1)所示、當(dāng)輸入馬的坐標(biāo)為(9,9)時,由于該坐標(biāo)不在 88 的棋盤內(nèi),所以程序提示要求重新輸入;如圖(2)所示,重新輸入數(shù)據(jù)位(1,1)滿足棋盤要求,得到在該位置的馬踏棋盤的結(jié)果。如圖(3)所示,當(dāng)位置選定為(4,4)時的結(jié)果。結(jié)果分析:如圖(3)所示,以數(shù)字遞增順序表示馬的下一個出口位置。如圖中,1 表示初始位置,按照國際象棋中馬的走棋規(guī)則并選擇最優(yōu)位置,即為 2 位置;3 表示 2 位置的馬的下一個出口位置
10、。以此循環(huán)下去,直到數(shù)字遍及整個棋盤。注:馬 的走棋路線即為圖中白線標(biāo)記部分(僅標(biāo)記了前 4 個位置)測試數(shù)據(jù) 1:輸入馬的初始位置(9,9),由于不符合要求,程序要求重新輸入6 6、用戶使用說明、用戶使用說明用戶需將源程序清單輸入可運行 C+的編輯平臺,例如 vc+, c+ Builder 等等,然后進(jìn)行編譯,然后用戶根據(jù)提示輸入馬的初始位置,程序會提示所輸入馬的初始位置必須在 1-8 之間,否則需要重新輸入,直至輸入的位置符合要求為止;輸入正確之后,程序會輸入馬兒踏遍整個棋盤的具體執(zhí)行步驟。注:阿拉伯?dāng)?shù)字 1、2、3、462、63、64。下一個數(shù)字所在位置即為上一個位置馬兒的出口。7 7、
11、參考文獻(xiàn)、參考文獻(xiàn)1王昆侖,李紅.數(shù)據(jù)結(jié)構(gòu)與算法.北京:鐵道工業(yè)出版社,2007 年 6 月第一版2.徐孝凱,魏榮數(shù)據(jù)結(jié)構(gòu),北京:機(jī)械工業(yè)出版社,1996 年3.徐孝凱數(shù)據(jù)結(jié)構(gòu)簡明教程 ,北京:清華大學(xué)出版社,1995 年4.陳文博,朱青數(shù)據(jù)結(jié)構(gòu)與算法 ,北京:機(jī)械工業(yè)出版社,1996 年5.許卓群,張乃孝,楊冬青,唐世渭數(shù)據(jù)結(jié)構(gòu) ,高等教育出版社,1988 年6.李廉治,姜文清,郭福順數(shù)據(jù)結(jié)構(gòu) ,大連理工大學(xué)出版社,1989 年計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 9 -附錄附錄源程序源程序/(1) 、定義頭文件和預(yù)定義#include#define MAXSIZE 100#define N 8/(
12、2) 、數(shù)據(jù)類型定義int board88; /定義棋盤int Htry18=1,-1,-2,2,2,1,-1,-2; /*存儲馬各個出口位置相對當(dāng)前位置行下標(biāo)的增量數(shù)組*/int Htry28=2,-2,1,1,-1,-2,2,-1; /*存儲馬各個出口位置相對當(dāng)前位置列下標(biāo)的增量數(shù)組*/struct Stack /定義棧類型 int i; /行坐標(biāo)int j; /列坐標(biāo) int director; /存儲方向stackMAXSIZE; /定義一個棧數(shù)組int top=-1; /棧指針/(3) 、函數(shù)聲明void InitLocation(int xi,int yi); /馬兒在棋盤上的起始
13、位置坐標(biāo)int TryPath(int i,int j); /馬兒每個方向進(jìn)行嘗試,直到試完整個棋盤void Display(); /輸出馬兒行走的路徑/(4) 、起始坐標(biāo)函數(shù)模塊void InitLocation(int xi,int yi)int x,y; /定義棋盤的橫縱坐標(biāo)變量top+; /棧指針指向第一個棧首stacktop.i=xi; /將起始位置的橫坐標(biāo)進(jìn)棧stacktop.j=yi; /將起始位置的縱坐標(biāo)進(jìn)棧計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 10 -stacktop.director=-1; /將起始位置的嘗試方向賦初值boardxiyi=top+1; /標(biāo)記棋盤x=stackto
14、p.i; /將起始位置的橫坐標(biāo)賦給棋盤的橫坐標(biāo)y=stacktop.j; /將起始位置的縱坐標(biāo)賦給棋盤的縱坐標(biāo)if(TryPath(x,y) /調(diào)用馬兒探尋函數(shù),如果馬兒探尋整個棋盤返回 1 否則返回 0Display(); /輸出馬兒的行走路徑else printf(無解); /(5) 、探尋路徑函數(shù)模塊int TryPath(int i,int j)int find,director,number,min; /定義幾個臨時變量int i1,j1,h,k,s; /定義幾個臨時變量int a8,b18,b28,d8; /定義幾個臨時數(shù)組while(top-1) /棧不空時循環(huán)for(h=0;h
15、=0&i=0&j8) /如果找到下一位置for(k=0;k=0&i1=0&j18) /如果找到下一位置 number+; /記錄條數(shù) ah=number; /將條數(shù)存入數(shù)組 a8中 for(h=0;h8;h+) /根據(jù)可行路徑條數(shù)小到大按下表排序放入數(shù)組 d8中min=9; for(k=0;kak) min=ak; dh=k; /將下表存入數(shù)組 d8中 s=k; as=9; director=stacktop.director; if(top=63) /如果走完整個棋盤返回 1return (1);find=0; /表示沒有找到下一個位置for(h=direct
16、or+1;h=0&i=0&j8) /如果找到下一位置計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告- 12 -find=1; /表示找到下一個位置break;if(find=1) /如果找到下一個位置進(jìn)棧stacktop.director=director; /存儲棧結(jié)點的方向 top+; /棧指針前移進(jìn)棧stacktop.i=i;stacktop.j=j;stacktop.director=-1; /重新初始化下一棧結(jié)點的嘗試方向boardij=top+1; /標(biāo)記棋盤else /否則退棧boardstacktop.istacktop.j=0; /清除棋盤的標(biāo)記top-; /棧指針前移退棧return (0); /(6)輸出路徑函數(shù)模塊void Display() int i,j; for(i=0;iN;i+)for(j=0;jN;j+)printf(t%d ,boardij); /輸出馬兒在棋盤上走過的路徑printf(nn);計科系數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲企業(yè)員工培訓(xùn)與派遣合同
- 車禍保險理賠與第三方賠償合同
- 兒童癲癇護(hù)理要點
- 中藥中毒護(hù)理要點解析
- 護(hù)理模擬面試要點解析與實戰(zhàn)準(zhǔn)備
- 創(chuàng)口止血護(hù)理技術(shù)要點
- 高中生物必修二知識點總結(jié)
- 高考語文復(fù)習(xí):文言文閱讀之?dāng)嗑渲饔^題填涂突破
- 《溫室氣體 產(chǎn)品碳足跡量化方法與要求 玻璃纖維紗產(chǎn)品》標(biāo)準(zhǔn)文本
- 肝炎治療護(hù)理常規(guī)
- 艾里遜8000系列變速箱培訓(xùn):《動力傳遞分析》
- 商務(wù)英語寫作實踐智慧樹知到答案章節(jié)測試2023年中北大學(xué)
- 社會治安動態(tài)視頻監(jiān)控系統(tǒng)工程建設(shè)方案
- 脫硫塔玻璃鱗片膠泥襯里施工組織設(shè)計
- XB/T 505-2011汽油車排氣凈化催化劑載體
- GB/T 3672.2-2002橡膠制品的公差第2部分:幾何公差
- GB/T 27744-2021異步起動永磁同步電動機(jī)技術(shù)條件及能效分級(機(jī)座號80~355)
- GB 8076-2008混凝土外加劑
- 寶盾轉(zhuǎn)門故障代碼
- 【課件】草原上的小木屋
- 醫(yī)務(wù)人員違規(guī)行為與年度考核掛鉤制度
評論
0/150
提交評論