版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計》報告</p><p> 最短路徑—拯救007 </p><p><b> 目 錄</b></p><p><b> 一、簡介3</b></p><p><b> 二、算法說明4</b></p><p
2、><b> 三、測試結(jié)果7</b></p><p><b> 參考文獻14</b></p><p><b> 一、簡介</b></p><p> 最短路徑是,在一個圖中,若從一個頂點到另一個頂點存在著一條路徑(這里只討論無回路的簡單路徑),則稱該條路徑長度為為該路徑上所有經(jīng)過的邊的數(shù)
3、目,它也等于該路徑上的頂點數(shù)減1。由于從一個頂點到另一個頂點可能存在著多條路徑,在每條路徑上所經(jīng)過的邊數(shù)可能不同,把路徑長度最短(經(jīng)過的邊數(shù)最少)的那條路徑叫做最短路徑,其路徑長度叫做最短距離。這是對無權(quán)圖而言的,若圖是帯權(quán)圖,則把從一個頂點vi到vj的一條路徑上所有經(jīng)過邊的權(quán)值之和定義為該路徑的帶權(quán)路徑長度。把帶權(quán)路徑長度最短的那條路徑稱為該有權(quán)圖的最短路徑,其路徑長度稱為最短距離。</p><p> Dij
4、ksra算法:如何求解從一個頂點到其余每個頂點的最短路徑呢?狄克斯特拉于1959年提出了解決此問題的一種按路徑長度的遞增次序產(chǎn)生最短路徑的算法。基本思想是,從圖中給定源點到其他各個頂點之間客觀上應(yīng)個存在一條最短路徑,在這組最短路徑中,按其長度的遞增次序求出到不同頂點的最短路徑和路徑長度。</p><p> 圖是一種較線性結(jié)構(gòu)和樹形結(jié)構(gòu)更為復(fù)雜的非線性數(shù)據(jù)結(jié)構(gòu),這種復(fù)雜性主要來自數(shù)據(jù)元素之間的復(fù)雜關(guān)系。在圖結(jié)構(gòu)中
5、,任何兩個數(shù)據(jù)元素之間都可能存在關(guān)系,一般用頂點表示數(shù)據(jù)元素,而用頂點之間的連線表示數(shù)據(jù)元素之間的關(guān)系。圖的二元組定義為:G=(V,E)。其中V是非空的頂點集合,E是V上的二元關(guān)系集合。</p><p><b> 題目內(nèi)容:</b></p><p> 看過007系列的電影的人們一定很熟悉Jams Bond這個世界上最著名的 特工了。在電影“Live And
6、 Let Die”中Jams Bond被一組毒品販子抓住并且關(guān)到湖中心的一個小島上,而湖中有很多兇猛的鱷魚。這時Jams Bond做出了一個最驚心動魄的事情來逃脫——他跳到了最近的鱷魚的頭上,在鱷魚還沒有反映過來的時候,他有跳到另一支鱷魚的頭上.。。。。。。最后他終于安全地跳到了湖岸上。</p><p> 假設(shè)湖是100*100的正方形,設(shè)湖的中心在(0,0),湖的東北角的坐標(biāo)是(50,50)。湖中心的圓環(huán)小島
7、的圓心在(0,0),直徑是15.。一些兇殘的鱷魚分布在湖中不同的位置?,F(xiàn)已知的湖中的鱷魚的位置和Jams Bond可以跳的最大距離,請你告訴Jams Bondyitiao 最短的到達湖邊的路徑。他逃出去的路徑長度等于他跳的次數(shù)。</p><p><b> 二、算法說明</b></p><p> 程序從“input.txt”文件中讀取輸入信息,這個文件包含了多組輸入
8、數(shù)據(jù)。每組輸入數(shù)據(jù)的起始行中包含了兩個整數(shù)n和d,n是鱷魚的數(shù)量而且n<=100,d是007可以跳的最大距離而且d>0。起始行下面的每一行是鱷魚的坐標(biāo)(x,y),其中x,y都是整數(shù),而且沒有任何兩只鱷魚出現(xiàn)在同一位置。Input.txt文件以一個負數(shù)結(jié)尾。</p><p><b> 輸出要求:</b></p><p> 程序結(jié)果輸出到output.tx
9、t文件中。對于每組輸入數(shù)據(jù),如果007可以逃脫,則輸出到output.txt文件的內(nèi)容格式如下:第一行是007必須跳的最小步數(shù),然后按照跳出順序記錄跳出路徑上的鱷魚坐標(biāo)(x,y),每行一個坐標(biāo)。如果007不可能跳出去,則將-1寫入文件。如果這里有很多個最短路徑,只需輸入其中的任意一種。</p><p><b> 輸入例子:</b></p><p> 10
10、 /*第一組輸入數(shù)據(jù)*/</p><p><b> 17 0</b></p><p><b> 27 0</b></p><p><b> 37 0</b></p><p><b> 45 0</b></p><p> 1
11、 10 /*第二組輸入數(shù)據(jù)*/</p><p><b> 20 30</b></p><p><b> -1</b></p><p><b> 輸出例子:</b></p><p> /*對應(yīng)第一組數(shù)據(jù)的輸出*/</p><p><
12、;b> 17 0</b></p><p><b> 27 0</b></p><p><b> 45 0</b></p><p> -1 /*對應(yīng)第二組數(shù)據(jù)的輸出*/</p><p> 提示:將每個鱷魚看作圖中的每一個頂點。如果007可以從A點跳到B點,則
13、A和B之間就有一條邊。</p><p> 主要數(shù)據(jù)結(jié)構(gòu)與算法:</p><p> 為了記錄007跳過的路徑,可定義為如下結(jié)構(gòu):</p><p> typedef unsigned int Vertez;</p><p> typedef double Distance;</p><p> typedef st
14、ruct GraphNodeRecord{</p><p> int X; /*x軸坐標(biāo)*/</p><p> int Y; /*y軸坐標(biāo)*/</p><p> unsigned int Step; /*記錄到本節(jié)點一共跳了多少步*/</p><p> Ver
15、tex Path; /*指向本節(jié)點的父節(jié)點,即跳到本節(jié)點之間007所在節(jié)點*/</p><p> }GraphNode;</p><p> typedef GraphNode*Grapha;</p><p> 尋找跳出路徑的算法:</p><p> /*讀出一組測試數(shù)據(jù)返回007跳過的路徑Graph,*Bank記錄最短到達
16、湖岸的路徑。該算法實際上是應(yīng)用隊列對圖驚醒廣度搜索,以尋找到岸邊的最短路徑,其中入隊列與出隊列函數(shù)分別是Inject()和Pop()*/</p><p> Graph read_case(FILE * InFile,int num,Vertex* Bank,Deque D)</p><p><b> { </b></p><p> G
17、raph G=NULL;</p><p> Distance JamesJump;</p><p><b> Vertex V;</b></p><p><b> int x,y;</b></p><p> int i,Times;</p><p> *Bank =
18、 0; /*初始化跳出的路徑的記錄*/</p><p> fscanf(Infile,”%lf”,&JamesJump);/*讀取步長*/</p><p> if(Bond can jumo to the bank directly)</p><p><b> {</b></p><p> *
19、Bank=1; /*直接跳出的情況*/</p><p><b> }</b></p><p> else if (num>0) /*007必須經(jīng)過鱷魚頭上的情況*/</p><p><b> {</b></p><p><b> num+=2;</b>
20、</p><p> G=GraphNew”(num);</p><p> for(i=2;i<num;i++) /*第3個node開始是鱷魚*/</p><p><b> {</b></p><p> if(Bond can jump to G[i] from island) /*判斷是否能從島上跳上
21、該點*/</p><p><b> {</b></p><p> G[i].Path=1;</p><p> G[i].Step=1; /*一步*/</p><p> if(Bond can jump to bankfrom G[i]) /*判斷該點是否能跳出*/</p><p&g
22、t;<b> {</b></p><p> *Bank =i; /*007可以跳出,記錄該點*/</p><p> Skip other crocodile</p><p><b> break;</b></p><p><b> }</b></p&
23、gt;<p><b> else</b></p><p> Inject(i,D);/*插入該點,并開始下一個檢測*/</p><p><b> }</b></p><p><b> }</b></p><p> while(!IsEmpty(D))
24、 /*只經(jīng)過一只鱷魚無法跳出,必須還要跳到其他鱷魚的情況*/</p><p><b> { </b></p><p><b> V=Pop(D);</b></p><p> for(i=2;i<num;i++)/*從這只鱷魚跳到其他各只鱷魚*/</p><p><b>
25、{</b></p><p> if(bond can jump from v to i,and step of i>step of v+1)</p><p><b> {</b></p><p> G[i].Path=V;</p><p> G[i].Step= G[V].Step+1;/*把i
26、點練到v點后面*/</p><p> if(bond can jump from ito bank and the path is shorter than others)</p><p><b> *Bank=i;</b></p><p><b> else</b></p><p> In
27、ject(i,D);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return
28、 G;</b></p><p><b> }</b></p><p> 在執(zhí)行完算法read_case后,*Bank值可能如下3種可能:</p><p> ?。?)0,意味著007無法逃脫出去;</p><p> ?。?)1,意味著007可以直接從島上跳出去,而不用經(jīng)過鱷魚的腦袋;</p>
29、<p> ?。?)k,返回的第k點是007經(jīng)過最短路徑逃出鱷魚潭是經(jīng)過的最后一個頂點。可以根據(jù)G[k]的path參數(shù)來追蹤該點的上一點,由此類推可以得到007逃脫的最短路徑。</p><p><b> 三、測試結(jié)果</b></p><p> 對于本程序,需要應(yīng)用各種類型的測試用例來進行測試。一般來說,可以設(shè)計一下幾種類型的測試用例。</p>
30、<p> ?007步長很大,以至于可以直接跳出,例如:</p><p><b> 43</b></p><p><b> 1</b></p><p> ?007不可能逃出去的情況(根本就沒有鱷魚),例如:</p><p><b> 1</b></p&
31、gt;<p><b> 1</b></p><p> ?一般情況的例子,例如:</p><p><b> 4 10</b></p><p><b> 17 0</b></p><p><b> 27 0</b></p>
32、;<p><b> 37 0</b></p><p><b> 45 0</b></p><p><b> 10</b></p><p><b> 20 30</b></p><p><b> 1</b>
33、</p><p> ?最短路徑有多條,只需要輸出任意一種即可,例如:</p><p><b> 25 10</b></p><p><b> 8 8</b></p><p><b> 9 9</b></p><p><b>
34、 10 10</b></p><p><b> 11 11</b></p><p><b> 12 12</b></p><p><b> 13 13</b></p><p><b> 14 14</b></p>
35、<p><b> 15 15</b></p><p><b> 16 16</b></p><p><b> 18 18</b></p><p><b> 20 20</b></p><p><b> 23 23&
36、lt;/b></p><p><b> 25 25</b></p><p><b> 27 27</b></p><p><b> 28 28</b></p><p><b> 29 29</b></p><p&g
37、t;<b> 31 31</b></p><p><b> 33 33</b></p><p><b> 35 35</b></p><p><b> 38 38</b></p><p><b> 41 41</b>
38、;</p><p><b> 44 44</b></p><p><b> 46 46</b></p><p><b> 47 47</b></p><p><b> 49 49</b></p><p><b&
39、gt; 輸出結(jié)果:</b></p><p><b> 7</b></p><p><b> 9 9</b></p><p><b> 16 16</b></p><p><b> 23 23</b></p>&l
40、t;p><b> 28 28</b></p><p><b> 35 35</b></p><p><b> 41 41</b></p><p> ?input.txt文件中,名稱不正確、空文件、缺少部分輸入等不規(guī)范情況,例如:</p><p><b&
41、gt; 5 10</b></p><p><b> 10 10</b></p><p><b> -25 30</b></p><p><b> 30 30</b></p><p> 注:缺少鱷魚點(應(yīng)有5個鱷魚點)和文件結(jié)尾符(-1)。</
42、p><p><b> 運行結(jié)果:</b></p><p><b> 輸入數(shù)據(jù):</b></p><p><b> 0 43</b></p><p><b> 0 1</b></p><p><b> 4 10<
43、/b></p><p><b> 17 0</b></p><p><b> 27 0</b></p><p><b> 37 0</b></p><p><b> 45 0</b></p><p><b>
44、 1 10</b></p><p><b> 20 30</b></p><p><b> 25 10</b></p><p><b> 8 8</b></p><p><b> 9 9</b></p><p>
45、;<b> 10 10</b></p><p><b> 11 11</b></p><p><b> 12 12</b></p><p><b> 13 13</b></p><p><b> 14 14</b></
46、p><p><b> 15 15</b></p><p><b> 16 16</b></p><p><b> 18 18</b></p><p><b> 20 20</b></p><p><b> 23 23
47、</b></p><p><b> 25 25</b></p><p><b> 27 27</b></p><p><b> 28 28</b></p><p><b> 29 29</b></p><p>&
48、lt;b> 31 31</b></p><p><b> 33 33</b></p><p><b> 35 35</b></p><p><b> 38 38</b></p><p><b> 41 41</b></p&
49、gt;<p><b> 44 44</b></p><p><b> 46 46</b></p><p><b> 47 47</b></p><p><b> 49 49</b></p><p><b> 10 20&l
50、t;/b></p><p><b> 10 10</b></p><p><b> 20 20</b></p><p><b> 10 30</b></p><p><b> 輸出結(jié)果</b></p><p><
51、b> 1</b></p><p><b> -1</b></p><p><b> 5</b></p><p><b> 17 0</b></p><p><b> 27 0</b></p><p>&l
52、t;b> 37 0</b></p><p><b> 45 0</b></p><p><b> -1</b></p><p><b> 7</b></p><p><b> 9 9</b></p><p&g
53、t;<b> 16 16</b></p><p><b> 23 23</b></p><p><b> 28 28</b></p><p><b> 35 35</b></p><p><b> 41 41</b><
54、/p><p><b> 3</b></p><p><b> 10 10</b></p><p><b> 10 30</b></p><p><b> 3</b></p><p><b> -10 -10</
55、b></p><p><b> -10 -30</b></p><p><b> 3</b></p><p><b> -10 -10</b></p><p><b> -30 -10</b></p><p><
56、b> 3</b></p><p><b> 10 10</b></p><p><b> 30 10</b></p><p><b> 3</b></p><p><b> 10 10</b></p><p&
57、gt;<b> 10 30</b></p><p><b> -1</b></p><p><b> 7</b></p><p><b> 10 10</b></p><p><b> 10 15</b></p>
58、<p><b> 20 15</b></p><p><b> 22 22</b></p><p><b> 31 20</b></p><p><b> 40 20</b></p><p><b> -1</b&g
59、t;</p><p><b> 7</b></p><p><b> -10 -8</b></p><p><b> -15 -15</b></p><p><b> 四、分析與探討</b></p><p> 1.明確題目
60、中的已知條件</p><p> (1)007被關(guān)的小島在湖的中心;</p><p> (2)小島是圓形,圓心在(0,0),而且直徑是15;</p><p> (3)沒有兩只鱷魚在同一個位置;</p><p> (4)鱷魚的坐標(biāo)值都是整數(shù)。</p><p> 2.一些判斷007是否能跳出的細節(jié)</p>
61、;<p> (1)判斷007是否能夠直接從島上跳到湖岸:由已知條件可得,湖是一個正方形,邊長為100,中心是在(0,0),四個頂點分別是(50,50),(50,-50),(-50,-50),(-50,50)。而湖中小島的直徑是15.所以如果007可以跳大于等于(50-15/2)=42.5,他就可以直接從小島跳到湖岸,而不用經(jīng)過鱷魚。</p><p> (2)判斷007是否能夠直接從島上跳到湖中點
62、A:已知半徑是7.5,假設(shè)點A的坐標(biāo)是(x,y),007的步長是L,則當(dāng)點A到中心(0,0)的距離小于等于007的步長加上小島的半徑7.5的時候就能確定007可以從島上跳到點A,即:x*x+y*y<=(L+7.5)*(L+7.5)。</p><p> (3)判斷007是否能夠從點A跳到點B:假設(shè)007的步長是L所以如果兩點之間的距離小于等于L,則判斷007可以從A跳到B,即(A.x-B.x)^2+(A.y
63、-B.y)^2<=L*L;其他情況時007不能從A點跳到B點。</p><p> (4)判斷007是否能夠從點A跳到湖岸:當(dāng)從A點到湖岸的距離小于等于007的步長的時候,說明他可以從A點跳到湖岸,|A.x|+L>=50或|A.y|+L>=50;其他情況時007不能從A點跳到湖岸。</p><p><b> 五、小結(jié)</b></p>
64、<p> 經(jīng)歷了這次課程設(shè)計實踐,我感觸頗深。此前一直錯誤的以為做課程設(shè)計其實是件很簡單的事情,根本不需要興師動眾而且花費那么長的時間,兩三天足矣。在此錯誤認識的引導(dǎo)下,也就沒怎么把它當(dāng)回事,只打算隨隨便便應(yīng)付一下,完工交差。但是等到真正親歷后才發(fā)現(xiàn)原來自己是多么的愚蠢可笑,自己的想法又是多么的幼稚、荒謬。</p><p> 做的過程并不順利,而其中的種種遭遇更是讓我反省良久。一路堅持下來,其中的艱
65、辛也許只有經(jīng)歷過才能真正體會。不過,經(jīng)過一番實踐后,當(dāng)看到自己親手做的東西就那么真實的擺在眼前,曾經(jīng)的心血與付出終于有了回報,那份激動與喜悅的心情又豈是三言兩語說得清楚的!“如人飲水,冷暖自知”,現(xiàn)在我是真的體會到了。</p><p> 總的來說,我覺得這次設(shè)計實踐收獲頗豐,于今后的學(xué)業(yè)、步入社會后參加工作乃至做人做事都是一筆不小的財富!通過這次課程設(shè)計,我懂得了實踐的重要性、團隊合作精神的可貴以及做事前的充足
66、準備與做事過程中的堅持和細心謹慎對于高質(zhì)高效地完成一項工作的特殊意義。任何事情都有一個循序漸進的過程,知難而進、勇往直前,只有這樣才有可能領(lǐng)略險峰的無限風(fēng)光。治學(xué)、做人又何嘗不是如此呢?</p><p> 先說實踐。關(guān)于實踐,前人曾留有十二字箴言:“實踐是檢驗真理的唯一標(biāo)準”,經(jīng)過這次課程設(shè)計,我所理解的實踐已遠不只此。人說“愛過才知情深,醉過方知酒濃”,我以為,只有實踐才會出真知,沒有實踐,任何理論、見解都是
67、蒼白無力的。眼之所見、心之所想大多數(shù)時候并不就是手之所為。在動手嘗試之前,我可以算是一個眼高手低的人。課程設(shè)計的題目下來了,共有三個可供選擇。相較之下我選了做“拯救007”,本以為這是最簡單的,基本上可以不費多大心力即輕松搞定。因此開始的幾天里也沒怎么刻意著手這件事情。事實卻是,等到我真正做了才發(fā)現(xiàn)隨著問題的不斷出現(xiàn)和為此而查閱許多相關(guān)的資料,花了那么多的時間與精力,做的過程還是如此的困難重重,并且做出來的東西也并非盡善盡美。方知許多事
68、情并非都如人所想,不實踐、不參與是無論如何也不會明白的。實踐之重要正在于此!這段小小的經(jīng)歷使我感觸很深,也教會我在以后的學(xué)習(xí)與工作中不要再眼高手低,任何事情都需親自嘗試后再做定斷。牢記“眼之所見、心之所想非手之所為也!”</p><p> 接下來再說著手前的準備。三國時諸葛亮草船借箭有賴“萬事俱備,只欠東風(fēng)”,而我的設(shè)計能順利進行也必須有充足的準備作為后盾。只可惜在一開始的時候由于并不很重視因此也未意識到這一點
69、,導(dǎo)致做的過程中停停找找、找找停停,嚴重影響了設(shè)計進度和效率,并且這種臨陣磨槍式的做法也使得準備很不充分,往往是急需要用的東西找也找不到,如某控件類的方法如何使用、其原型或者參數(shù)的類型與意義為何等等。這樣一來,自然會遇到重重困難。我想,如果在動手之前已經(jīng)做好了充足準備,必然會少遇到很多麻煩,也不會一度出現(xiàn)舉步維艱的情況。當(dāng)然了,這次還只是一個小小的設(shè)計,如果換成是某個大型系統(tǒng)的設(shè)計豈不是無法想象?所以這次經(jīng)歷也算是給了我一個教訓(xùn):千萬不
70、要打無準備的仗!早準備方保無虞。</p><p> 說到了準備,也得說說做事過程中的堅持與細心謹慎。很難想象如果沒有堅持到底的勇氣和不懈的努力,當(dāng)一個人面對困難時能迎難而上并一路堅持走下來。當(dāng)初我選定這個設(shè)計課題時正是考慮到它簡單、易完成(當(dāng)然事實并非如此),不過后來做的時候不斷出現(xiàn)新的問題,而且有些還是從理論上無法解釋的,這時我就在想算了吧,這么難搞,還是換別的做。正好其他同學(xué)做的在網(wǎng)上找到了很多原本的版本,
71、因而做起來就不費吹灰之力。當(dāng)時幾乎就在一念之間轉(zhuǎn)了方向,好在隨后終于做成功了一部分功能。這點小小的成功讓我體會到了自己動手的樂趣與成功后的喜悅,在此激勵之下,幸而堅持了下來?;匚镀渲械钠D辛,盡享成功的喜悅,縱是雛鷹試翼之作,畢竟自己所為,比之其他同學(xué)照搬別人的代碼以完成任務(wù)卻不知到底做了什么、又有什么收獲,不是更有意義嗎?能夠堅持即已成功一半。世上無難事,唯恐少堅持!</p><p> 此外,在做的過程中不可能
72、是一帆風(fēng)順的,必然免不了頻繁出錯。這一方面是由于輸入時的粗心大意造成的,另一方面則是編寫的代碼本身的問題。對于前者,如果能在操作時做到細心謹慎,當(dāng)然可以避免。即便免不了輸入錯誤,在調(diào)試的過程中也應(yīng)細心謹慎,惟其如此,方可免去許多麻煩,保證軟件設(shè)計的質(zhì)量與效率。由于要不斷的調(diào)試,而VC6.0對于用戶所作的改動會自動保存,因此就可能出現(xiàn)保存了修改后錯誤的結(jié)果,反而將前面做好的調(diào)試無誤的內(nèi)容覆蓋掉的情況。如果沒有時時保持細心謹慎的態(tài)度,及時對
73、調(diào)試無誤的結(jié)果加以保存,將可能遭遇前</p><p> 功盡棄的“滅頂之災(zāi)”。不管怎樣,時時處處細心謹慎,方保順利無虞。我想,無論是治學(xué)還是工作或是為人,這</p><p> 樣的一種態(tài)度都是至關(guān)重要的。</p><p> 由于是初次設(shè)計,僅憑自己一人之力是很難完成的,所以大家或借助于網(wǎng)絡(luò),或借助于參考書籍、期刊資料等。我也不例外,和幾位同學(xué)一起研究設(shè)計方案及
74、具體實現(xiàn)方法,并跑了好幾趟圖書館,查資料,抄筆記,上網(wǎng)搜索資料,終于在大家的通力合作之下完成了這個項目。一起做的過程大家朝著一個共同的目標(biāo)努力,分工協(xié)作,互相交流,提出不同的想法,不斷完善,不斷進步,一個一個的問題迎刃而解,一個一個的功能不斷做出來。最后,集體的勞動終于換來了豐碩的成果(盡管并不完美)。這次經(jīng)歷使我懂得了團隊合作精神的可貴。不僅如此,我覺得這次合作的過程真的是很愉快,很讓人回味和懷念!我想將來參加工作后這種合作還會有,參
75、與合作,倡導(dǎo)這種合作精神是很可貴和重要的。社會的進步使得人們面臨的問題越來越復(fù)雜,迫使人們尋求集體的智慧、團隊的力量來解決它們。個人的力量終究是有限的,也不可能獨立完成所有的事情,每個人都有義務(wù)和必要學(xué)會與別人溝通、交流,學(xué)會合作,參與合作,在合作的過程中培養(yǎng)這樣一種意識。對于將來的工作,這也是有重要意義的。</p><p> 最后,值得一提的是編輯這份電子文稿,也使我學(xué)會了使用更多的Word功能。雖然不是本次
76、設(shè)計的正題,但畢竟也算是一種收獲吧。能夠多學(xué)一點知識,總算也是一種成就。</p><p> 課程設(shè)計即將結(jié)束,一個個挑燈夜戰(zhàn)、激烈討論的夜晚也已過去?;仡櫿麄€過程,更清楚的認識到知識的欠缺,而自己所學(xué)的VC++知識只能算是皮毛,還有更多的東西需要我去研究,去掌握。盡管如此,我也不會退縮、停滯不前,因為通過這次設(shè)計實踐,我已初識VC++的廬山真面目。這才是最重要的。相信經(jīng)過此次課程設(shè)計,日后將會有所改進。此外,我
77、還要感謝所有幫助過我的老師、同學(xué),感謝你們在這幾天里給我的幫助與鼓勵。正是因為你們的幫助與鼓勵,我才能很好的完成這一次的課程設(shè)計,才能學(xué)到這么多的知識;也正是因為你們的幫助與鼓勵,我真正認識到了團隊力量的偉大,“團結(jié)就是力量?!备兄x你們,謝謝。</p><p><b> 參考文獻</b></p><p> [1] 劉振安,劉燕君.C程序設(shè)計課程設(shè)計[M].[北京]
78、機械工業(yè)出版社,2004年9月</p><p> [2] 譚浩強.C程序設(shè)計(第三版).清華大學(xué)出版社,2005年7月</p><p> [3] 嚴蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版).清華大學(xué)出版社,1997年4月</p><p> [4] 李志球《實用C語言程序設(shè)計教程》 北京:電子工業(yè)出版社,1999</p><p> [5] 王
79、立柱:C/C++與數(shù)據(jù)結(jié)構(gòu) 北京:清華大學(xué)出版社,2002</p><p> [6] 吳文虎 《程序設(shè)計基礎(chǔ)》 北京:清華大學(xué)出版社,2003</p><p> [7] 郭福順,王曉芬,李蓮治 《數(shù)據(jù)結(jié)構(gòu)》(修訂本),大連理工大學(xué)出版社,1997</p><p> [8] 潘道才,陳一華 《數(shù)據(jù)結(jié)構(gòu)》,電子科技大學(xué)出版社,1994</p>&l
80、t;p><b> 附錄:</b></p><p><b> 源代碼</b></p><p> 本程序包含3個頭文件和4個C源程序文件,分別是:Graph.h Graph.c Deque.h Deque.c </p><p> error.h error.c main.c </p&g
81、t;<p><b> 1.Graph.h</b></p><p> #ifndef _GRAPH_H_</p><p> #define _GRAPH_H_</p><p> #define ISLAND_DIAMETER 15 /* 小島的直徑 */</p><p> #define L
82、AKE_BOUNDARY_X50/* 小島到湖邊的距離,在x軸上 */</p><p> #define LAKE_BOUNDARY_Y50/* 小島到湖邊的距離,在y軸上 */</p><p> #define INFINITY10000 /* 可以跳的步數(shù)的最大值 */</p><p> typedef unsigned int Ver
83、tex;</p><p> typedef double Distance;</p><p> typedef struct GraphNodeRecord{</p><p> int X; /* x軸坐標(biāo) */</p><p> int Y; /* y軸坐標(biāo) */</p><
84、;p> unsigned int Step; /*跳至該點的步數(shù) */</p><p> Vertex Path; /*記錄上一個點 */</p><p> } GraphNode;</p><p> typedef GraphNode *Graph;</p><p> Graph
85、 GraphNew(int NodeNum);</p><p> void GraphDelete(Graph G);</p><p> /* 判斷007是否能從起始處跳至該點(x, y) */</p><p> int CheckForStart(int x, int y, Distance d);</p><p> /* 判斷00
86、7是否能從該點跳至河岸 */</p><p> int CheckForEnd(int x, int y, Distance d);</p><p> /* 判斷007是否能從點i跳至點j */ </p><p> int CheckForConnect(Graph g, Vertex i, Vertex j, Distance d);</p>
87、<p><b> #endif</b></p><p><b> 2.Graph.c</b></p><p> #include "Graph.h"</p><p> #include "error.h"</p><p> #include
88、 <stdlib.h></p><p> /******創(chuàng)建新的Graph******/</p><p> Graph GraphNew(int NodeNum)</p><p><b> {</b></p><p><b> Graph G;</b></p>&l
89、t;p><b> int i;</b></p><p> if(NodeNum <= 0)return NULL;</p><p> G = malloc(NodeNum * sizeof(GraphNode)); /* 分配空間 */</p><p><b> CHECK(G);</b></
90、p><p> for(i = 0; i < NodeNum; i++) /* 初始化 */</p><p><b> {</b></p><p> G[i].X = 0;</p><p> G[i].Y = 0;</p><p> G[i].Step =
91、 INFINITY; </p><p> G[i].Path = 0;</p><p><b> }</b></p><p><b> return G;</b></p><p><b> }</b></p><p> /******刪除一個G
92、raph)******/</p><p> void GraphDelete(Graph G)</p><p><b> {</b></p><p> if(G)free(G);</p><p><b> }</b></p><p> /*******判斷007是否
93、能從起始處跳至該點(x, y),步長是d******/</p><p> int CheckForStart(int x, int y, Distance d)</p><p><b> {</b></p><p><b> double t;</b></p><p> t = (ISLAN
94、D_DIAMETER + (d * 2.0));</p><p> return (x*x + y*y) <= t*t/4.0; </p><p> /* x^2 + y^2 <= (ISLAND_DIAMETER/2.0 + d)^2 */</p><p><b> }</b></p><p>
95、 /*******判斷007是否能從該點跳至河岸,步長是d******/</p><p> int CheckForEnd(int x, int y, Distance d)</p><p><b> {</b></p><p> if(x < 0)x = -x; /* 取x的絕對值 */</
96、p><p> if(y < 0)y = -y; /* 取y的絕對值 */</p><p> return (d >= LAKE_BOUNDARY_X - x)/* 由于湖是個正方形,只需檢查這兩個距離*/</p><p> || (d >= LAKE_BOUNDARY_Y - y);</p><
97、;p><b> }</b></p><p> /*******判斷007是否能從點i跳至點j,步長是d******/</p><p> int CheckForConnect(Graph g, Vertex i, Vertex j, Distance d)</p><p><b> {</b></p&g
98、t;<p><b> int x, y;</b></p><p> x = g[i].X - g[j].X;</p><p> y = g[i].Y - g[j].Y;</p><p> return x*x + y*y <= d*d;</p><p><b> }</b&g
99、t;</p><p><b> 3.Deque.h</b></p><p> #ifndef _DEQUE_H_</p><p> #define _DEQUE_H_</p><p> typedef unsigned int ElemType; /* 在本程序中ElemType指定為int */
100、</p><p> /* 鏈表形式 */</p><p> typedef struct NodeRecord{</p><p> ElemType Element;</p><p> struct NodeRecord *Next; /* 指向下一個node */</p><p><b>
101、; } *Node; </b></p><p> typedef struct DequeRecord{ </p><p> Node Front, Rear; /* 分別指向Deque的前后兩個點 */</p><p><b> } *Deque;</b></p><p> D
102、eque DequeNew();</p><p> void DequeDelete(Deque D); </p><p> void DequeClear(Deque D); </p><p> int IsEmpty(Deque D); </p><p> void Push(ElemType X, Dequ
103、e D); </p><p> ElemType Pop(Deque D); </p><p> void Inject(ElemType X, Deque D); </p><p><b> #endif</b></p><p><b> Deque.c</b></p>
104、<p> #include "Deque.h"</p><p> #include "error.h"</p><p> #include <stdlib.h></p><p> /******創(chuàng)建新的Deque******/</p><p> Deque Deque
105、New()</p><p><b> {</b></p><p><b> Deque D;</b></p><p> D = malloc(sizeof(struct DequeRecord));</p><p><b> CHECK(D);</b></p>
106、;<p> D->Front = D->Rear = malloc(sizeof(struct NodeRecord)); /* 空的頭 */</p><p> CHECK(D->Front);</p><p> D->Front->Element = 0; /* 初始化 */
107、</p><p> D->Rear->Next = NULL;</p><p><b> return D;</b></p><p><b> }</b></p><p> /******刪除Deque******/</p><p> void Deq
108、ueDelete(Deque D)</p><p><b> {</b></p><p><b> if(D)</b></p><p><b> {</b></p><p> while(D->Front) </p><p><b&g
109、t; {</b></p><p> D->Rear = D->Front->Next;</p><p> free(D->Front);</p><p> D->Front = D->Rear;</p><p><b> }</b></p><
110、p><b> free(D);</b></p><p><b> }</b></p><p><b> }</b></p><p> /******DequeClear刪除所有的節(jié)點除了頭節(jié)點******/</p><p> void DequeClear(De
111、que D)</p><p><b> {</b></p><p><b> if(D)</b></p><p><b> {</b></p><p> while(D->Front->Next) /* 刪除第一個節(jié)點 */</p>
112、<p><b> {</b></p><p> D->Rear = D->Front->Next->Next;</p><p> free(D->Front->Next);</p><p> D->Front->Next = D->Rear;</p><
113、p><b> }</b></p><p> D->Rear = D->Front;</p><p><b> }</b></p><p><b> }</b></p><p> /******判斷Deque是否為空******/</p>
114、<p> int IsEmpty(Deque D)</p><p><b> {</b></p><p> return D->Front == D->Rear;</p><p><b> }</b></p><p> /******將X元素壓占到D中******/
115、</p><p> void Push(ElemType X, Deque D) </p><p><b> { </b></p><p> Node NewNode; </p><p> NewNode = malloc(sizeof(struct NodeRecord)); /* 建立新的節(jié)點 */
116、 </p><p> CHECK(NewNode);</p><p> NewNode->Element = X; </p><p> NewNode->Next = D->Front->Next; </p><p> if(D->Front == D->Rear)
117、 /* 如果D為空 */</p><p> D->Rear = NewNode;</p><p> D->Front->Next = NewNode;/* 壓棧 */ </p><p><b> }</b></p><p> /******將第一個元素出棧******/</p&
118、gt;<p> ElemType Pop(Deque D) </p><p><b> { </b></p><p> Node Temp; </p><p> ElemType Item; </p><p> if(D->Front == D->Rear)</p>&l
119、t;p><b> {</b></p><p> Error("Deque is empty");</p><p> return 0; </p><p><b> }</b></p><p><b> else </b></p
120、><p><b> { </b></p><p> Temp = D->Front->Next;/* 得到第一個元素 */ </p><p> D->Front->Next = Temp->Next; /* 重置第一個元素 */</p><p> if(Temp == D-&g
121、t;Rear)/* 如果只有一個元素 */</p><p> D->Rear = D->Front;/* 將D置空 */ </p><p> Item = Temp->Element; </p><p> free(Temp);</p><p> return Item; </p&g
122、t;<p><b> } </b></p><p><b> }</b></p><p> /******插入元素X至D末尾******/ </p><p> void Inject(ElemType X, Deque D) </p><p><b> { &l
123、t;/b></p><p> Node NewNode;</p><p> NewNode = malloc(sizeof(struct NodeRecord)); /* 創(chuàng)建新節(jié)點 */ </p><p> CHECK(NewNode);</p><p> NewNode->Element = X; </p>
124、;<p> NewNode->Next = NULL;</p><p> D->Rear->Next = NewNode;</p><p> D->Rear = NewNode; </p><p><b> }</b></p><p> 5.error.h &l
125、t;/p><p> # ifndef ___DS_PROJ_2_ERROR_H___</p><p> # define ___DS_PROJ_2_ERROR_H___</p><p> #define CHECK(X) if(NULL == (X))Error("Out of space!!!")</p><p>
126、void Error(const char *msg);</p><p> void Warning(const char *msg);</p><p><b> #endif</b></p><p><b> error.c </b></p><p> #include "er
127、ror.h"</p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> /******打印錯誤信息,并退出程序******/ </p><p> void Error(const char *msg)</p>&l
128、t;p><b> {</b></p><p> if(NULL != msg)</p><p> fprintf(stderr,"%s\n",msg);</p><p><b> exit(-1);</b></p><p><b> }</b>
129、;</p><p> /******打印警告信息,但并不退出程序******/</p><p> void Warning(const char *msg)</p><p><b> {</b></p><p> if(NULL != msg)</p><p> fprintf(stde
130、rr,"%s\n",msg);</p><p><b> }</b></p><p><b> main.c</b></p><p> #include "Graph.h"</p><p> #include "Deque.h"&l
131、t;/p><p> #include "error.h"</p><p> #include <stdlib.h></p><p> #include <stdio.h></p><p> /******讀入一個case返回一個Graph,*Bank 記錄最短到達河岸的路徑******/<
132、/p><p> Graph read_case(FILE *InFile, int num, Vertex* Bank, Deque D)</p><p><b> {</b></p><p> Graph G = NULL;</p><p> Distance JamesJump;</p><p
133、><b> Vertex V;</b></p><p><b> int x, y;</b></p><p> int i, Times;</p><p> *Bank = 0;</p><p> fscanf(InFile, "%lf", &JamesJ
134、ump);</p><p> if(CheckForEnd(0, 0, JamesJump + ISLAND_DIAMETER/2.0))</p><p><b> {</b></p><p> for(i = 0; i < (num << 1); i++) /*一步便跳出的情況 */</p><
135、p> fscanf(InFile, "%d", &x);</p><p> *Bank = 1;</p><p><b> }</b></p><p> else if(num > 0) /* 007必須經(jīng)過鱷魚頭上的情況 */</p><p
136、><b> {</b></p><p><b> num += 2;</b></p><p> G = GraphNew(num);</p><p> for(i = 2; i < num; i++) /* 第三個node開始是鱷魚 */</p><p>&l
137、t;b> {</b></p><p> fscanf(InFile, "%d", &x);</p><p> fscanf(InFile, "%d", &y);</p><p> G[i].X = x;</p><p> G[i].Y = y;</p&g
138、t;<p> if(CheckForStart(x, y, JamesJump)) /*判斷是否能跳上該點*/</p><p><b> {</b></p><p> G[i].Path = 1; /*007可以跳到 */</p><p> G[i].Step = 1;
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 最短路徑--拯救007課程設(shè)計
- 課程設(shè)計-故宮導(dǎo)游咨詢設(shè)計(最短路徑)
- 課程設(shè)計報告---最短路徑求最大利潤
- 單元點最短路徑算法的實現(xiàn)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu),課程設(shè)計,校園最短路徑問題
- 通信網(wǎng)最短路徑課程設(shè)計--基于c語言對d算法最短路徑的求解
- a算法的改進課程設(shè)計--a最短路徑算法的改進
- 最短路徑問題―――螞蟻爬行的最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---圖頂點間最短路徑算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--dijkstra算法求最短路徑
- 最短路徑問題--教學(xué)設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---交通旅游圖的最短路徑問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--弗洛伊德算法與最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--可視化弗洛伊德最短路徑
- 最短路徑學(xué)年論文
- 最短路徑問題(經(jīng)典)
- 最短路徑規(guī)劃研究
- 最短路徑問題(經(jīng)典)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--用c#語言解決最短路徑的問題
- 軸對稱——最短路徑問題
評論
0/150
提交評論