版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 數(shù)據(jù)結(jié)構課程設計報告</p><p><b> 題目:迷宮問題</b></p><p><b> 姓名:</b></p><p><b> 學號:</b></p><p><b> 班級:</b></p><
2、;p><b> 指導教師:</b></p><p><b> 2012年6月6日</b></p><p><b> 問題描述</b></p><p> 輸入任意大小的迷宮數(shù)據(jù),用遞歸和非遞歸方法求出一條走出迷宮的路徑,并將路徑輸出。</p><p><b&g
3、t; 設計思路</b></p><p> 以 0和1分別表示迷宮中的通路和障礙,沒有通路則不顯示。未顯示為得出沒有通路的結(jié)論;</p><p> 走迷宮的方式是一個一個的線路去試 如果是死路的話就退回去,類似數(shù)據(jù)結(jié)構中棧的先進后出,所以可以用棧這種結(jié)構表示迷宮,通過不斷的試驗當試出最后的路線時輸出棧即可,由于它是不斷循環(huán)的實驗,所以可以采用鏈棧實現(xiàn)迷宮的求解。同時因為迷宮
4、需要不斷重復的試驗,可以看成反復的調(diào)用“迷宮“這個函數(shù),這是典型的遞歸問題,所以也可以使用遞歸解決問題。另外由于數(shù)據(jù)對象是迷宮所以可以用0和1構建不同類型的迷宮更符合實際也更有樂趣。</p><p><b> 數(shù)據(jù)結(jié)構設計</b></p><p> 前面提到要用到鏈棧和遞歸兩種方式操作;為了更好的以鏈表作存儲結(jié)構的棧,可以用二維數(shù)組存儲迷宮信息,同時通路以三元組(
5、i,j,d)的形式輸出,其中:(i,j)指示迷宮中的一個坐標,d表示走到下一個坐標的方向。這樣是路徑更加明顯,具體的數(shù)據(jù)結(jié)構為:</p><p> #define maxsize 100</p><p> #define NULL 0</p><p> typedef struct//定義迷宮</p><p><b&g
6、t; {</b></p><p> int Maze[maxsize][maxsize];//二維數(shù)組存放迷宮信息</p><p> int maze_x,maze_y;//迷宮的行數(shù)和列數(shù)</p><p><b> }maze;</b></p><p> typedef struct
7、point//鏈棧的每個結(jié)點定義</p><p><b> {</b></p><p> int vex_x,vex_y;//結(jié)點的橫縱坐標</p><p> int direction;//下一個結(jié)點的方向</p><p> struct point *next;//指向下一個
8、結(jié)點</p><p><b> }Point;</b></p><p> 遞歸法像一位手握大權的領導。當他站在迷宮入口處時,他才懶得親自去走,這時這位領導會吩咐他的手下,讓他們分別向著迷宮的各個方向去探索;當遇到岔路口時留一個人守在這里,再分出幾股人,朝著每個方向繼續(xù)探索;最后總會有一個人發(fā)現(xiàn)出口。發(fā)現(xiàn)出口的這個人將出口的位置報告給離他最近的路口處留守的人,再由這
9、個人報告給上一個路口的人,依次層層上報,最后消息傳到了領導那里,于是這位領導就順著這條畫好的通路大搖大擺地通過了迷宮。所以具體的數(shù)據(jù)結(jié)構為:</p><p> #include<stdio.h></p><p> #include<malloc.h></p><p> #define maxsize 100</p><
10、;p> #define NULL 0</p><p> typedef struct//定義迷宮</p><p><b> {</b></p><p> int Maze[maxsize][maxsize];//二維數(shù)組存放迷宮信息</p><p> int maze_x,maze_y;
11、//迷宮的行數(shù)和列數(shù)</p><p><b> }maze;</b></p><p><b> maze a;</b></p><p> typedef struct point//鏈棧的每個結(jié)點定義</p><p><b> {</b></p>
12、;<p> int vex_x,vex_y;//結(jié)點的橫縱坐標</p><p> int direction;//下一個結(jié)點的方向</p><p> struct point *next;//指向下一個結(jié)點</p><p><b> }Point;</b></p><p>
13、<b> 4.功能函數(shù)設計</b></p><p> <1>一個用于存放迷宮信息的二維數(shù)組maze[][]</p><p><b> 相關操作:</b></p><p> a.二維數(shù)組的初始化maze creat()</p><p> b.數(shù)組以指針形式在各個函數(shù)中傳遞。<
14、;/p><p> c.可以改變數(shù)組中的行數(shù)和列數(shù)。</p><p> <2>結(jié)構體point *next:指向下一個結(jié)點</p><p> <3>結(jié)構體printmazepath:輸出迷宮路徑。</p><p> <4>結(jié)構體secret:搜索迷宮路徑。</p><p><
15、b> 5.編碼實現(xiàn)</b></p><p><b> 非遞歸:</b></p><p> #include<stdio.h></p><p> #include<malloc.h></p><p> #define maxsize 100</p><
16、p> #define NULL 0</p><p> typedef struct</p><p><b> {</b></p><p> int Maze[maxsize][maxsize];</p><p> int maze_x,maze_y;</p><p><b&g
17、t; }maze;</b></p><p> typedef struct point </p><p><b> {</b></p><p> int vex_x,vex_y; </p><p> int direction;
18、 </p><p> struct point *next; </p><p><b> }Point;</b></p><p> maze creat()</p><p><b> {</b></p><p><b> i
19、nt i,j;</b></p><p><b> maze a;</b></p><p> printf("hang shu he lei shu:");</p><p> scanf("%d%d",&a.maze_x,&a.maze_y);</p><
20、;p> for(i=1;i<=a.maze_x;i++)</p><p><b> {</b></p><p> printf("shu ru %d hang:",i);</p><p> for(j=1;j<=a.maze_y;j++)</p><p> scanf(&q
21、uot;%d",&a.Maze[i][j]);</p><p><b> }</b></p><p><b> return a;</b></p><p><b> }</b></p><p> int found(int x,int y,Point
22、*head) {</p><p> Point *p=head;</p><p><b> while(p)</b></p><p><b> {</b></p><p> if(x==p->vex_x&&y==p->vex_y)</p><p
23、><b> return 1;</b></p><p> p=p->next;</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p>&
24、lt;p> Point *secret(maze a) </p><p><b> {</b></p><p> Point *top,*p; </p><p> int j,m,x,y;</p><p> p=(Point *)
25、malloc(sizeof(Point));</p><p> p->vex_x=1;</p><p> p->vex_y=1;</p><p> p->next=NULL;</p><p><b> top=p;</b></p><p><b> j=1;&
26、lt;/b></p><p><b> do</b></p><p><b> {</b></p><p> while(j<=4)</p><p><b> {</b></p><p><b> m=0;</b&g
27、t;</p><p> x=top->vex_x;</p><p> y=top->vex_y;</p><p><b> switch(j)</b></p><p><b> {</b></p><p> case 1:if(y+1<=a.maz
28、e_y&&!a.Maze[x][y+1]&&!found(x,y+1,top))</p><p><b> {</b></p><p> p=(Point *)malloc(sizeof(Point));</p><p> p->vex_x=x;p->vex_y=y+1;</p>
29、<p> p->next=top;</p><p> top->direction=j;</p><p> top=p;m=1;</p><p><b> }</b></p><p><b> break;</b></p><p> case
30、 2:if(x+1<=a.maze_x&&!a.Maze[x+1][y]&&!found(x+1,y,top))</p><p><b> {</b></p><p> p=(Point *)malloc(sizeof(Point));</p><p> p->vex_x=x+1;p->v
31、ex_y=y;</p><p> p->next=top;</p><p> top->direction=j;</p><p> top=p;m=1;</p><p><b> }</b></p><p><b> break;</b></p&g
32、t;<p> case 3:if(y-1<=a.maze_y&&!a.Maze[x][y-1]&&!found(x,y-1,top))</p><p><b> {</b></p><p> p=(Point *)malloc(sizeof(Point));</p><p> p-&g
33、t;vex_x=x;p->vex_y=y-1;</p><p> p->next=top;</p><p> top->direction=j;</p><p> top=p;m=1;</p><p><b> }</b></p><p><b> break
34、;</b></p><p> case 4:if(x-1<=a.maze_x&&!a.Maze[x-1][y]&&!found(x-1,y,top))</p><p><b> {</b></p><p> p=(Point *)malloc(sizeof(Point));</p&g
35、t;<p> p->vex_x=x-1;p->vex_y=y;</p><p> p->next=top;</p><p> top->direction=j;</p><p> top=p;m=1;</p><p><b> }</b></p><p&
36、gt;<b> break;</b></p><p><b> }</b></p><p><b> if(m!=0)</b></p><p> {j=1;break;}</p><p><b> else j++;</b></p>
37、<p><b> }</b></p><p><b> if(j>4)</b></p><p><b> {</b></p><p> if(top!=NULL)</p><p><b> {</b></p>&l
38、t;p> top=top->next;</p><p> if(top==NULL)return NULL;</p><p> j=top->direction+1;top->direction=j;</p><p><b> }</b></p><p><b> }</
39、b></p><p> }while(top->vex_x!=a.maze_x||top->vex_y!=a.maze_y);</p><p> if(top->vex_x==a.maze_x&&top->vex_y==a.maze_y)top->direction=0;</p><p> return to
40、p;</p><p><b> }</b></p><p> int print(Point *p)</p><p><b> {</b></p><p> int i=0,top=0;</p><p> Point *stack[maxsize];</p&g
41、t;<p> if(p==NULL) </p><p><b> {</b></p><p> printf("bu neng dao da lu kou!\n");</p><p><b> return 0;</b></p><p><b>
42、 }</b></p><p><b> else</b></p><p><b> {</b></p><p> printf("shu chu lu jing(san yuan zu biao shi):\n");</p><p> while(p!=NUL
43、L)</p><p><b> {</b></p><p> stack[top++]=p;</p><p> p=p->next;</p><p><b> }</b></p><p> while(top>0)</p><p>
44、;<b> {</b></p><p><b> top--;</b></p><p> printf("(%d,%d,%d)",stack[top]->vex_x,stack[top]->vex_y,stack[top]->direction);</p><p><b&g
45、t; i++;</b></p><p> if(i%8==0)printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> printf("\n");</p>&l
46、t;p><b> return 1;</b></p><p><b> }</b></p><p> void printmazepath(Point *p,maze road)</p><p><b> {</b></p><p><b> int
47、i,j;</b></p><p> char m[maxsize][maxsize];</p><p> printf("lu jing tu shi:\n");</p><p> for(i=1;i<=road.maze_x;i++)</p><p> for(j=1;j<=road.ma
48、ze_y;j++)</p><p><b> {</b></p><p> if(road.Maze[i][j])m[i][j]='1';</p><p> else m[i][j]='0';</p><p><b> }</b></p><
49、;p><b> while(p)</b></p><p><b> {</b></p><p> switch(p->direction)</p><p><b> {</b></p><p> case 0:m[p->vex_x][p->ve
50、x_y]=1;break;</p><p> case 1:m[p->vex_x][p->vex_y]=26;break;</p><p> case 2:m[p->vex_x][p->vex_y]=25;break;</p><p> case 3:m[p->vex_x][p->vex_y]=27;break;</p
51、><p> case 4:m[p->vex_x][p->vex_y]=24;break;</p><p><b> }</b></p><p> p=p->next;</p><p><b> }</b></p><p> for(i=1;i<=
52、road.maze_x;i++)</p><p> for(j=1;j<=road.maze_y;j++)</p><p><b> {</b></p><p> printf("%c",m[i][j]);</p><p> if(j<road.maze_y)printf(&quo
53、t; ");</p><p> else printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p><b> {</
54、b></p><p> maze road;</p><p><b> Point *p;</b></p><p> road=creat();</p><p> p=secret(road);</p><p> if(print(p))printmazepath(p,road);
55、</p><p><b> getch();</b></p><p><b> }</b></p><p><b> 遞歸</b></p><p> #include<stdio.h></p><p> #include<ma
56、lloc.h></p><p> #define maxsize 100</p><p> #define NULL 0</p><p> typedef struct</p><p><b> {</b></p><p> int Maze[maxsize][maxsize];&
57、lt;/p><p> int maze_x,maze_y;</p><p><b> }maze;</b></p><p><b> maze a;</b></p><p> typedef struct point</p><p><b> {</b&
58、gt;</p><p> int vex_x,vex_y;</p><p> int direction;</p><p> struct point *next;</p><p><b> }Point;</b></p><p> maze creat()</p><
59、;p><b> {</b></p><p><b> int i,j;</b></p><p><b> maze a;</b></p><p> printf("shu ru hang he lie:");</p><p> scanf(&
60、quot;%d%d",&a.maze_x,&a.maze_y);</p><p> for(i=1;i<=a.maze_x;i++)</p><p><b> {</b></p><p> printf("shu ru di %d hang:",i);</p><p&
61、gt; for(j=1;j<=a.maze_y;j++)</p><p> scanf("%d",&a.Maze[i][j]);</p><p><b> }</b></p><p><b> return a;</b></p><p><b>
62、 }</b></p><p> int found(int x,int y,Point *head)</p><p><b> {</b></p><p> Point *p=head;</p><p><b> while(p)</b></p><p>
63、<b> {</b></p><p> if(x==p->vex_x&&y==p->vex_y)</p><p><b> return 1;</b></p><p> p=p->next;</p><p><b> }</b><
64、;/p><p><b> return 0;</b></p><p><b> }</b></p><p><b> int k=1;</b></p><p> int print(Point *p)</p><p><b> {<
65、/b></p><p> int i=0,top=0;</p><p> Point *stack[maxsize];</p><p> if(p==NULL) {printf("bu neng dao da!\n");return 0;}</p><p><b> else</b>&l
66、t;/p><p><b> {</b></p><p> printf("shu chu di %d tiao mi gong lu jing(san yuan zu):\n",k++);</p><p> while(p!=NULL)</p><p><b> {</b>&
67、lt;/p><p> stack[top++]=p;if(top==1)stack[top-1]->direction=0;</p><p> p=p->next;</p><p><b> }</b></p><p> while(top>0)</p><p><b&
68、gt; {</b></p><p><b> top--;</b></p><p> printf("(%d,%d,%d)",stack[top]->vex_x,stack[top]->vex_y,stack[top]->direction);</p><p><b> i++
69、;</b></p><p> if(i%8==0)printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p> printf("\n");</p><p>
70、<b> return 1;</b></p><p><b> }</b></p><p> void printmazepath(Point *p,maze road)</p><p><b> {</b></p><p><b> int i,j;<
71、;/b></p><p> char m[maxsize][maxsize];</p><p> printf("mi gong lu jing tu shi :\n");</p><p> for(i=1;i<=road.maze_x;i++)</p><p> for(j=1;j<=road.
72、maze_y;j++)</p><p><b> {</b></p><p> if(road.Maze[i][j])m[i][j]='1';</p><p> else m[i][j]='0';</p><p><b> }</b></p>&
73、lt;p><b> while(p)</b></p><p><b> {</b></p><p> switch(p->direction)</p><p><b> {</b></p><p> case 0:m[p->vex_x][p->
74、vex_y]=1;break;</p><p> case 1:m[p->vex_x][p->vex_y]=26;break;</p><p> case 2:m[p->vex_x][p->vex_y]=25;break;</p><p> case 3:m[p->vex_x][p->vex_y]=27;break;<
75、/p><p> case 4:m[p->vex_x][p->vex_y]=24;break;</p><p><b> }</b></p><p> p=p->next;</p><p><b> }</b></p><p> for(i=1;i<
76、;=road.maze_x;i++)</p><p> for(j=1;j<=road.maze_y;j++)</p><p><b> {</b></p><p> printf("%c",m[i][j]);</p><p> if(j<road.maze_y)printf(&q
77、uot; ");</p><p> else printf("\n");</p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p><p> i
78、nt sign=0;</p><p> void mazepath(Point *p,int j)</p><p><b> {</b></p><p> int x,y,i;</p><p><b> Point *q;</b></p><p> x=p->
79、vex_x;y=p->vex_y;</p><p><b> switch(j)</b></p><p><b> {</b></p><p><b> case 1:</b></p><p> if(y+1<=a.maze_y&&!foun
80、d(x,y+1,p)&&!a.Maze[x][y+1])</p><p><b> {</b></p><p> q=(Point*)malloc(sizeof(Point));</p><p> q->vex_x=x;q->vex_y=y+1;q->next=p;</p><p>
81、; p->direction=j;</p><p> if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y)</p><p><b> {</b></p><p> if(print(q))printmazepath(q,a);sign=1;</p><
82、p><b> }</b></p><p> else for(i=1;i<=4;i++)</p><p> mazepath(q,i);</p><p><b> }</b></p><p><b> break;</b></p><p
83、><b> case 2:</b></p><p> if(x+1<=a.maze_x&&!found(x+1,y,p)&&!a.Maze[x+1][y])</p><p><b> {</b></p><p> q=(Point*)malloc(sizeof(Point
84、));</p><p> q->vex_x=x+1;q->vex_y=y;q->next=p;</p><p> p->direction=j;</p><p> if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y)</p><p><b>
85、 {</b></p><p> if(print(q))printmazepath(q,a);sign=1;</p><p><b> }</b></p><p> else for(i=1;i<=4;i++)</p><p> mazepath(q,i);</p><p&g
86、t;<b> }</b></p><p><b> break;</b></p><p><b> case 3:</b></p><p> if(y-1>=1&&!found(x,y-1,p)&&!a.Maze[x][y-1])</p>&
87、lt;p><b> {</b></p><p> q=(Point*)malloc(sizeof(Point));</p><p> q->vex_x=x;q->vex_y=y-1;q->next=p;</p><p> p->direction=j;</p><p> if(q-
88、>vex_x==a.maze_x&&q->vex_y==a.maze_y)</p><p><b> {</b></p><p> if(print(q))printmazepath(q,a);sign=1;</p><p><b> }</b></p><p>
89、 else for(i=1;i<=4;i++)</p><p> mazepath(q,i);</p><p><b> }</b></p><p><b> break;</b></p><p><b> case 4:</b></p><p
90、> if(x-1>=1&&!found(x-1,y,p)&&!a.Maze[x-1][y])</p><p><b> {</b></p><p> q=(Point*)malloc(sizeof(Point));</p><p> q->vex_x=x-1;q->vex_y=y;
91、q->next=p;</p><p> p->direction=j;</p><p> if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y)</p><p><b> {</b></p><p> if(print(q))printmaze
92、path(q,a);sign=1;</p><p><b> }</b></p><p> else for(i=1;i<=4;i++)</p><p> mazepath(q,i);</p><p><b> }</b></p><p><b>
93、break;</b></p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p><b> int i;<
94、;/b></p><p><b> Point *p;</b></p><p> a=creat();</p><p> p=(Point*)malloc(sizeof(Point));</p><p> p->vex_x=1;p->vex_y=1;p->next=NULL;</p&
95、gt;<p> printf("\n di gui qiu de mi gong mei you ke neng de lu xian\n");</p><p> for(i=1;i<=4;i++)</p><p> mazepath(p,i);</p><p> if(sign==0)</p><
96、;p> printf("bu neng dao da chu kou\n");</p><p><b> getch();</b></p><p><b> }</b></p><p><b> 6.運行與測試</b></p><p><
97、b> 非遞歸:</b></p><p> 首先輸入行數(shù)和列數(shù),然后按行輸入迷宮信息我輸入的是:</p><p><b> 行數(shù)6,列數(shù)8:;</b></p><p> 迷宮信息為:0 1 1 1 0 1 1 1;0 0 0 0 1 1 1 1;0 1 0 0 0 0 0 1;0 1 1 1 0 0 1 1;</p
98、><p> 1 0 0 1 1 0 0 0;0 1 1 0 0 1 1 0; </p><p><b> 運行結(jié)果為:</b></p><p> 、 </p><p><b> 遞歸:</b></p><p> 首先輸入行數(shù)和列數(shù),然后按行輸入迷宮
99、信息我輸入的是:</p><p> 輸入6行8列的迷宮信息:</p><p> 0 1 1 1 0 1 1 1;0 0 0 0 1 1 1 1;0 1 0 0 0 0 0 1;0 1 1 1 0 0 1 1;</p><p> 1 0 0 1 1 0 0 0;0 1 1 0 0 1 1 0; </p><p><b> 運
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構課程設計報告---迷宮求解
- 《數(shù)據(jù)結(jié)構》課程設計報告迷宮求解
- 數(shù)據(jù)結(jié)構迷宮求解課程設計報告
- 數(shù)據(jù)結(jié)構迷宮課程設計
- 數(shù)據(jù)結(jié)構迷宮課程設計
- 數(shù)據(jù)結(jié)構課程設計---迷宮
- 數(shù)據(jù)結(jié)構課程設計報告----迷宮問題
- 數(shù)據(jù)結(jié)構課程設計報告---迷宮算法
- 數(shù)據(jù)結(jié)構課程設計報告-迷宮求解
- 數(shù)據(jù)結(jié)構課程設計迷宮問題課程設計報告
- 數(shù)據(jù)結(jié)構課程設計報告---迷宮問題
- 迷宮問題——數(shù)據(jù)結(jié)構課程設計迷宮問題
- 迷宮求解數(shù)據(jù)結(jié)構課程設計報告
- 迷宮求解數(shù)據(jù)結(jié)構課程設計報告
- 數(shù)據(jù)結(jié)構課程設計(迷宮問題)
- 數(shù)據(jù)結(jié)構課程設計----迷宮求解
- 數(shù)據(jù)結(jié)構課程設計-迷宮求解
- 迷宮游戲數(shù)據(jù)結(jié)構課程設計
- 數(shù)據(jù)結(jié)構課程設計迷宮問題
- 數(shù)據(jù)結(jié)構課程設計--迷宮問題
評論
0/150
提交評論