版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 題 目: 迷宮問題 </p><p><b> 課程設(shè)計目的</b></p><p> 1, 深入了解棧的特征及數(shù)據(jù)結(jié)構(gòu)。</p><p> 2, 了解迷宮問題的提出背景以及試探法的求解思路。</p><p>
2、 3, 設(shè)計實現(xiàn)一個完整的迷宮求解程序。</p><p><b> 課程設(shè)計內(nèi)容</b></p><p> 迷宮是實驗心理學(xué)中一個古典問題。用計算機解迷宮路徑的程序,就是仿照人走迷宮。計算機解迷宮時,通常用的是"窮舉求解"的方法,即從入口出發(fā),順某一方向向前探索,若能走通,則繼續(xù)往前走;否則沿原路退回,換一個方向再繼續(xù)探索,直至所有可能的通路
3、都探索到為止。</p><p><b> 三、需求分析</b></p><p> 電腦自動存儲迷宮,先將m*n迷宮先輸入在文件中,通過輸入文件名(*.txt),將該迷宮在屏幕上顯示出來,選擇通路。</p><p> 由用戶自己手動創(chuàng)建迷宮,將創(chuàng)建好的m*n迷宮保存在文件(*.txt)中,選擇通路。</p><p>
4、 用“回溯法”來尋找通路,借用一個move[4]數(shù)組來存儲四個方向,數(shù)組的i,j兩個域分別表示行列位移的增量,在通過棧的相關(guān)操作來求解通路。</p><p> 最終的解要求在屏幕上顯示并存入文件(*.txt)中。</p><p><b> 四、概要設(shè)計</b></p><p><b> 1.系統(tǒng)結(jié)構(gòu)圖</b><
5、;/p><p><b> 2.功能模塊說明</b></p><p> 1,定義相關(guān)的結(jié)構(gòu)體。</p><p> 2,關(guān)于棧的操作,入棧,出棧,判空棧,銷毀棧。</p><p> 3,先在文本文件中創(chuàng)建好一個迷宮,然后顯示在屏幕上,尋找通路并保存。</p><p> 4,用戶自己手動創(chuàng)建好一個
6、迷宮,并保存在文件中,然后尋找通路并保存。</p><p> 5,利用菜單選擇自己創(chuàng)建迷宮的方式。</p><p> 五、詳細設(shè)計及運行結(jié)果</p><p><b> 1,主要的流程圖</b></p><p> 2,重要的程序,Seekpath的主要算法</p><p> //尋找迷宮路
7、徑并保存</p><p> void Seekpath(char maze[Max][Max])</p><p><b> {</b></p><p> int i, j, d, x, y, m, n;</p><p> Seqstack *S;</p><p><b> F
8、ILE *fp;</b></p><p> Item move[4]; </p><p> Elemtype t;</p><p> fp=fopen("路徑.txt","wt");</p><p> S = (struct stack *)malloc(sizeof
9、(struct stack));</p><p> InitStack(S);</p><p> move[0].i = 0; move[0].j = 1; //move[4]數(shù)組的初始化</p><p> move[1].i = 1; move[1].j = 0;</p><p> move[2].i = 0; mov
10、e[2].j = -1;</p><p> move[3].i = -1;move[3].j = 0; </p><p><b> d = 0;</b></p><p> printf("請輸入您想出的出口.\n");</p><p> scanf("%d %d",&am
11、p;m,&n);</p><p> printf("請輸入您想進的入口. \n");</p><p> scanf("%d",&t.i);</p><p><b> t.j = 1;</b></p><p> t.d = -1;
12、 //初始方向為-1</p><p> if(S==NULL)</p><p><b> {</b></p><p> printf("error!");</p><p><b> return;</b></p><p>&l
13、t;b> }</b></p><p> PushStack(S, t); //棧里的第一個元素就是入口點</p><p> while(!EmptyStack(S))</p><p><b> {</b></p><p> PopStack(S, &
14、;t); //第一個元素出棧</p><p><b> i = t.i;</b></p><p><b> j = t.j;</b></p><p> d = t.d +1; //下一個方向</p><p> while(
15、d<4) //開始試探東南西北四個方向</p><p><b> {</b></p><p> x = i+move[d].i;</p><p> y = j+move[d].j; //試探后的新坐標</p><p> if(maze[x][y
16、] == '0')</p><p><b> {</b></p><p><b> t.i = i;</b></p><p><b> t.j = j;</b></p><p><b> t.d = d;</b></p>
17、<p> PushStack(S, t); //可以走的坐標入棧</p><p><b> i=x; j=y;</b></p><p> maze[i][j] = -1; //已走過的路置為-1</p><p> if(m==i && n==j) //判斷是否到了
18、出口</p><p><b> {</b></p><p> printf("通路為:\n"); //將走通的路徑打印出來</p><p> printf("(%2d,%2d) <==",m, n);</p><p> fprintf(fp,"
19、;%2d,%2d",m,n); //將m,n的值按%2d和%2d的格式輸出到fp指向的文件上</p><p> while(!EmptyStack(S) && S->top!=0) </p><p><b> {</b></p><p> PopStack(S, &t);</p&
20、gt;<p> printf("(%2d,%2d) <== ",t.i,t.j);</p><p> fputs("<==",fp);</p><p> fprintf(fp,"%2d,%2d",t.i,t.j);</p><p><b> }</b>
21、</p><p> if(S->top==0)</p><p> PopStack(S, &t);</p><p> printf("(%2d,%2d) ",t.i,t.j);</p><p> printf("\n路徑已保存!\n");</p><p>
22、 fputs("<==",fp);</p><p> fprintf(fp,"%2d,%2d",t.i,t.j);</p><p> DestoryStack(&S); //所有的元素出棧之后銷毀棧</p><p><b> return;</b></p><
23、;p><b> }</b></p><p><b> else</b></p><p><b> d=0;</b></p><p><b> }</b></p><p><b> else</b></p>
24、<p><b> d++;</b></p><p><b> }</b></p><p><b> }</b></p><p> DestoryStack(&S);</p><p> printf("該迷宮不能走通!\n");&
25、lt;/p><p> fclose(fp);</p><p><b> return ;</b></p><p><b> }</b></p><p><b> 3,運行結(jié)果 </b></p><p> (1),文本文件中提前存儲好迷宮,然后選擇通
26、路。</p><p><b> 文件可以打開的情況</b></p><p><b> 文件不能打開的情況</b></p><p> ?。?),用戶手動創(chuàng)建迷宮</p><p><b> 有通路的情況</b></p><p><b> 沒
27、有通路的情況</b></p><p> 六、調(diào)試情況,設(shè)計技巧及體會</p><p><b> 1,調(diào)試情況</b></p><p> 在調(diào)試的時候,程序出現(xiàn)了好多問題,有邏輯上的錯誤,還有語法上的錯誤,特別是文件的讀寫方式那經(jīng)常搞錯,還有一個關(guān)于緩沖區(qū)的問題,經(jīng)常忘記用</p><p> Flush
28、all(),導(dǎo)致調(diào)試時出現(xiàn)問題。不過最后經(jīng)過仔細的分析解決了這個問題,最終的程序也沒有太大的問題。</p><p><b> 2,程序的優(yōu)缺點</b></p><p> 我認為本次程序中較好的一點是,我可以用兩種方法來創(chuàng)建迷宮并顯示在屏幕上,然后查找通路并保存。不足之處是沒有找到最短路徑,界面也不夠美觀好看,最終展示出的迷宮路徑不太直觀,如果用動態(tài)的會更好。<
29、;/p><p><b> 3,心得體會</b></p><p> 通過一周的學(xué)習(xí)與上機編程,大大提高了我的編程能力,讓我把棧的相關(guān)知識和數(shù)據(jù)結(jié)構(gòu)有了更好的理解。同時也使我面對一個程序時,能更好地深刻的去理解它,分析它,找出最有效的解決方法。在面對不懂的問題時,請教老師或同學(xué),幫助我解決問題,這樣也有助于我能力的提高。但在以后還需要多多上機編程,真正學(xué)通數(shù)據(jù)結(jié)構(gòu)這門課,
30、為之后的相關(guān)科目打好基礎(chǔ)??傊?,此次實習(xí),我收獲頗多,以后會更加努力的。</p><p><b> 七、參考文獻</b></p><p> 數(shù)據(jù)結(jié)構(gòu)-C語言描述 C語言程序設(shè)計</p><p><b> 八、附錄:源代碼</b></p><p> #include<stdio.h
31、></p><p> #include<malloc.h></p><p> #include<string.h></p><p> #include<stdlib.h></p><p> #define stacksize 20</p><p> #define M
32、ax 20 //maze[][]數(shù)組行列的最大范圍</p><p> typedef struct //move[4]的兩個域,0,1,2,3分別表示東西南北</p><p> { </p><p> int i; //i表示行位移</p>
33、<p> int j; //j表示列位移</p><p><b> }Item;</b></p><p> typedef struct //棧中每一個節(jié)點的三個元素</p><p> { </p><p> int i;
34、 //當前的行坐標</p><p> int j; //當前的列坐標</p><p> int d; //下一步要到達的方向</p><p> }Elemtype;</p><p> //有關(guān)順序棧的相關(guān)操作</p><p> typedef struc
35、t stack</p><p><b> {</b></p><p> Elemtype data[stacksize];</p><p><b> int top;</b></p><p> }Seqstack;</p><p><b> //初始化棧&
36、lt;/b></p><p> void InitStack(Seqstack *S)</p><p><b> {</b></p><p> S->top = -1;</p><p><b> }</b></p><p><b> //入棧&
37、lt;/b></p><p> int PushStack(Seqstack *S,Elemtype x)</p><p><b> {</b></p><p> if(S->top == stacksize-1 )</p><p><b> return 0;</b></
38、p><p><b> S->top++;</b></p><p> S->data[S->top]=x;</p><p><b> return 1;</b></p><p><b> }</b></p><p><b>
39、 //出棧</b></p><p> int PopStack(Seqstack *S,Elemtype *x)</p><p><b> {</b></p><p> if(S->top == -1)</p><p><b> return 0;</b></p&g
40、t;<p><b> else</b></p><p><b> {</b></p><p> *x = S->data[S->top];</p><p><b> S->top--;</b></p><p><b> ret
41、urn 1;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //判空棧</b></p><p> int EmptyStack(Seqstack *S)</p><p>
42、<b> {</b></p><p> if(S->top == -1)</p><p><b> return 1;</b></p><p><b> else </b></p><p><b> return 0;</b></p&
43、gt;<p><b> }</b></p><p><b> //銷毀棧</b></p><p> void DestoryStack(Seqstack **S)</p><p><b> {</b></p><p><b> if(*S)&l
44、t;/b></p><p><b> free(*S);</b></p><p> *S = NULL;</p><p><b> return; </b></p><p><b> }</b></p><p> //電腦自動創(chuàng)建迷宮&l
45、t;/p><p> int dcreatmaze(char maze[][Max],int M,int N) //M N為電腦自動創(chuàng)建時的行和列</p><p><b> {</b></p><p> int i, j; //創(chuàng)建迷宮時的下標,i表示行,j表示列</p>
46、;<p> FILE *fp; </p><p><b> char n;</b></p><p> char filename[20];</p><p> printf("請輸入要打開文件的完整路徑及文件名: ");</p>
47、<p> flushall();</p><p> gets(filename);</p><p> fp = fopen(filename, "r"); //只讀,為輸入打開一個文本文件</p><p> if( fp == NULL)</p><p><b>
48、{</b></p><p> printf("文件打開失敗,文件名可能不存在 !\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p> flushall();</p><p&
49、gt; while(!feof(fp)) //用來測試fp所指向的文件當前狀態(tài)是否"文件結(jié)束"</p><p><b> {</b></p><p> for(i=0; i<M; i++)</p><p><b> {</b></p><p&
50、gt; for(j=0;j<N;j++)</p><p><b> {</b></p><p> fscanf(fp,"%c",&maze[i][j]); //將磁盤文件中的數(shù)據(jù)送給maze[][]數(shù)組</p><p><b> }</b></p><p&g
51、t; fscanf(fp,"%c",&n); //將磁盤文件中的換行給n</p><p><b> }</b></p><p><b> }</b></p><p> fclose(fp);</p><p> printf("\n
52、親,您現(xiàn)在可以走迷宮了~~~\n");</p><p> for(i=0; i<=M; i++) //輸出迷宮</p><p><b> {</b></p><p> for(j=0; j<=N; j++)</p><p><b> {&
53、lt;/b></p><p> if (maze[i][j] == '1')</p><p> printf("◆");</p><p> else if(maze[i][j] == '0')</p><p> printf("◇");</p>
54、<p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> printf("\n");</p><p><b> return 1;</b>&l
55、t;/p><p><b> }</b></p><p> //尋找迷宮路徑并保存</p><p> void Seekpath(char maze[Max][Max])</p><p><b> {</b></p><p> int i, j, d, x, y, m,
56、 n;</p><p> Seqstack *S;</p><p><b> FILE *fp;</b></p><p> Item move[4]; </p><p> Elemtype t;</p><p> fp=fopen("路徑.txt",&
57、quot;wt");</p><p> S = (struct stack *)malloc(sizeof(struct stack));</p><p> InitStack(S);</p><p> move[0].i = 0; move[0].j = 1; //move[4]數(shù)組的初始化</p><p>
58、 move[1].i = 1; move[1].j = 0;</p><p> move[2].i = 0; move[2].j = -1;</p><p> move[3].i = -1;move[3].j = 0; </p><p><b> d = 0;</b></p><p> printf("
59、;請輸入您想出的出口.\n");</p><p> scanf("%d %d",&m,&n);</p><p> printf("請輸入您想進的入口. \n");</p><p> scanf("%d",&t.i);</p><p><b
60、> t.j = 1;</b></p><p> t.d = -1; //初始方向為-1</p><p> if(S==NULL)</p><p><b> {</b></p><p> printf("error!");&
61、lt;/p><p><b> return;</b></p><p><b> }</b></p><p> PushStack(S, t); //棧里的第一個元素就是入口點</p><p> while(!EmptyStack(S))</p>
62、<p><b> {</b></p><p> PopStack(S, &t); //第一個元素出棧</p><p><b> i = t.i;</b></p><p><b> j = t.j;</b></p><p>
63、; d = t.d +1; //下一個方向</p><p> while(d<4) //開始試探東南西北四個方向</p><p><b> {</b></p><p> x = i+move[d].i;</p><p> y
64、 = j+move[d].j; //試探后的新坐標</p><p> if(maze[x][y] == '0')</p><p><b> {</b></p><p><b> t.i = i;</b></p><p><b> t.j = j
65、;</b></p><p><b> t.d = d;</b></p><p> PushStack(S, t); //可以走的坐標入棧</p><p><b> i=x; j=y;</b></p><p> maze[i][j] = -1; //已走
66、過的路置為-1</p><p> if(m==i && n==j) //判斷是否到了出口</p><p><b> {</b></p><p> printf("通路為:\n"); //將走通的路徑打印出來</p><p> printf(&qu
67、ot;(%2d,%2d) <==",m, n);</p><p> fprintf(fp,"%2d,%2d",m,n); //將m,n的值按%2d和%2d的格式輸出到fp指向的文件上</p><p> while(!EmptyStack(S) && S->top!=0) </p><p>&
68、lt;b> {</b></p><p> PopStack(S, &t);</p><p> printf("(%2d,%2d) <== ",t.i,t.j);</p><p> fputs("<==",fp);</p><p> fprintf(fp,&
69、quot;%2d,%2d",t.i,t.j);</p><p><b> }</b></p><p> if(S->top==0)</p><p> PopStack(S, &t);</p><p> printf("(%2d,%2d) ",t.i,t.j);<
70、/p><p> printf("\n路徑已保存!\n");</p><p> fputs("<==",fp);</p><p> fprintf(fp,"%2d,%2d",t.i,t.j);</p><p> DestoryStack(&S); //所有的元素
71、出棧之后銷毀棧</p><p><b> return;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> d=0;</b></p><p><b>
72、; }</b></p><p><b> else</b></p><p><b> d++;</b></p><p><b> }</b></p><p><b> }</b></p><p> Desto
73、ryStack(&S);</p><p> printf("該迷宮不能走通!\n");</p><p> fclose(fp);</p><p><b> return ;</b></p><p><b> }</b></p><p>
74、void zcreatmaze(char maze[Max][Max]) </p><p><b> {</b></p><p> int i,j,m,n;</p><p><b> FILE *fp;</b></p><p><b> char ch;</b><
75、/p><p> fp=fopen("migong.txt","wt"); //為輸出打開一個文本文件,只寫</p><p> printf("請輸入迷宮的行數(shù)和列數(shù)(包括外圍的墻壁):");</p><p> scanf("%d%d",&m,&n);</p&g
76、t;<p> flushall();</p><p> printf("\n請輸入迷宮\n");</p><p> for(i=0;i<m;i++)</p><p> {//創(chuàng)建迷宮</p><p> for(j=0;j<n;j++)</p><p>
77、 scanf("%c",&maze[i][j]);</p><p> flushall();</p><p><b> }</b></p><p> printf("\n");</p><p> printf("您創(chuàng)建的迷宮為:\n\n");&
78、lt;/p><p> for(i=0; i<m; i++) //輸出迷宮 </p><p><b> {</b></p><p> for(j=0; j<n; j++)</p><p><b> {</b></p><p> if(maze[i][j]
79、 == '1')</p><p> printf("◆");</p><p> else if(maze[i][j] == '0')</p><p> printf("◇");</p><p> fprintf(fp,"%c ",maze[i
80、][j]);</p><p><b> } </b></p><p> fprintf(fp,"\n");</p><p> printf("\n");</p><p><b> }</b></p><p> fclose(f
81、p);</p><p> printf("\n");</p><p> printf("該迷宮已保存!\n");</p><p> Seekpath(maze);</p><p> printf("\n");</p><p><b> }&
82、lt;/b></p><p> void menu()</p><p><b> {</b></p><p> printf("\t ※※※※※※※※※※※※※※※\n\n");</p><p> printf("\t ☆1
83、. 電腦自動生成迷宮 \n");</p><p> printf("\t ☆2. 用戶手動創(chuàng)建迷宮 \n");</p><p> printf("\t ☆0. 退出系統(tǒng) \n\n");</p><p> print
84、f("\t ※※※※※※※※※※※※※※※ \n");</p><p> printf("\t 輸入數(shù)字編號(0-2):");</p><p><b> }</b></p><p> void main()</p><p><
85、b> {</b></p><p> char maze[Max][Max];</p><p> int choice;</p><p> while(choice)</p><p><b> {</b></p><p> flushall();</p>
86、<p> system("cls");</p><p><b> menu();</b></p><p> scanf("%d",&choice);</p><p> switch(choice)</p><p><b> { </b&
87、gt;</p><p><b> case 1: </b></p><p> system("cls");</p><p> dcreatmaze(maze,8,8);</p><p> Seekpath(maze);</p><p> printf("\n
88、");</p><p> system("pause");</p><p><b> break;</b></p><p><b> case 2:</b></p><p> system("cls");</p><p&g
89、t; zcreatmaze(maze);</p><p> system("pause");</p><p><b> break;</b></p><p><b> case 0:</b></p><p><b> break;</b></
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 迷宮問題課程設(shè)計報告
- 迷宮問題課程設(shè)計報告
- 迷宮問題課程設(shè)計報告
- 迷宮問題課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題課程設(shè)計報告
- 迷宮課程設(shè)計報告
- 迷宮課程設(shè)計報告
- 迷宮問題——數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告----迷宮問題
- c語言課程設(shè)計--迷宮問題
- 課程設(shè)計(迷宮)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(迷宮問題)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計—迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)迷宮問題課程設(shè)計
評論
0/150
提交評論