資料結構課程設計 迷宮問題課程設計報告

2021-06-07 12:33:33 字數 3569 閱讀 3812

上學時沒學過資料結構和演算法,於是現在有機會就自學。下面是我最近在等待進入專案組期間,花了1小時學習了一下迷宮問題。下面是我學習時找到的一篇課程設計的報告,然後自己先看懂,然後又在vc6.0下執行了。

迷宮問題

一.需求設計:以乙個m*m 的方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對任意設定的迷宮,求出一條從入口的通道,或得出沒有通路的結論。

二.概要設計:

儲存結構:

採用了陣列以及結構體來儲存資料,在探索迷宮的過程中用到的棧,屬於順序儲存結構。

/*八個方向的陣列表示形式*/

int move[8][2]=,,,,,,,};

/*用結構體表示位置*/

struct position ;

position stack[m*m+1];

基本演算法:

每前進或後退一步,都要進行判斷:若前進到了出口處,則說明找到了一條通路;若退回到了入口處,則說明不存在通路。

用乙個字元型別的二維陣列表示迷宮,陣列中每個元素取值「0」(表示通路)或「1」(表示牆壁)。迷宮的入口點在位置(1,1)處,出口點在位置(m,m)處。設計乙個模擬走迷宮的演算法,為其尋找一條從入口點到出口點的通路。

二維陣列的第0行、第m+1行、第0列、第m+1列元素全置成「1」,表示迷宮的邊界;第1行第1列元素和第m行第m列元素置成「0」,表示迷宮的入口和出口;其餘元素值用隨機函式產生。

假設當前所在位置是(x,y)。沿某個方向前進一步,它可能到達的位置最多有8個。

如果用二維陣列move記錄8個方向上行下標增量和列下標增量,則沿第i個方向前進一步,可能到達的新位置座標可利用move陣列確定:

x=x+move[i][0]

y=y+move[i][1]

從迷宮的入口位置開始,沿圖示方向順序依次進行搜尋。

在搜尋過程中,每前進一步,在所到位置處做標記「」

(表示這個位置在通路上),並將該位置的座標壓入棧中。

每次後退的時候,先將當前所在位置處的通路標記「」改

成死路標記「×」(表示這個位置曾到達過但走不通,以後

不要重複進入),然後將該位置的座標從棧頂彈出。

搜尋到出口位置時,陣列中那些值為「」的元素形成一條

通路。

三.詳細設計:

源程式:

/*

迷宮問題

走迷宮的過程可以模擬為乙個搜尋的過程:每到一

處,總讓它按東、東南、南、西南、西、西北、北、東北

個方向順序試探下乙個位置;如果某方向可以通過,並且不

曾到達,則前進一步,在新位置上繼續進行搜尋;如果個

方向都走不通或曾經到達過,則退回一步,在原來的位置上

繼續試探下一位置。

每前進或後退一步,都要進行判斷:若前進到了出

口處,則說明找到了一條通路;若退回到了入口處,則說明

不存在通路。

用乙個字元型別的二維陣列表示迷宮,陣列中每個元素

取值「0」(表示通路)或「1」(表示牆壁)。迷宮的入口點在

位置(1,1)處,出口點在位置(m,m)處。這個演算法,為

其尋找一條從入口點到出口點的通路。

*/#include#include#include#includeint main(void)

,,, ,,,,};

/*用結構體表示位置*/

struct position

;/*用於記錄和輸出迷宮探路中相關符號,包括1 .*/

char maze[10][10];

/*用棧來儲存探路過程中的資料*/

position stack[64+1];

int top;/*棧頂*/

int i,x,y,ok;

position p;

/*二維陣列的第0行、第m+1行、第0列、第m+1列元素全

置成"1",表示迷宮的邊界;第1行第1列元素和第m行第m列

元素置成"0",表示迷宮的入口和出口;其餘元素值用隨機

函式產生。*/

srand(time(0)); /* 產生乙個隨機種子 */

for(x=1;x<=m;x++)

for(y=1;y<=m;y++)

maze[x][y]=48+rand()%2;

maze[1][1]='0';maze[m][m]='0'; /* 入口 */

for(x=0;x<=m+1;x++)

for(y=0;y<=m+1;y++)

p.x=1;p.y=1;

top=1;stack[top]=p;

maze[1][1]='.';

/*開始探路

走迷宮的過程可以模擬為乙個搜尋的過程:每到一

處,總讓它按東、東南、南、西南、西、西北、北、東北

個方向順序試探下乙個位置;如果某方向可以通過,並且不

曾到達,則前進一步,在新位置上繼續進行搜尋;如果個

方向都走不通或曾經到達過,則退回一步,在原來的位置上

繼續試探下一位置。

每前進或後退一步,都要進行判斷:若前進到了出

口處,則說明找到了一條通路;若退回到了入口處,則說明

不存在通路。*/

doi++;

}if(i==8)

} while((top>0)&&((p.x!=m)||(p.y!=m)));

/*輸出探路結果*/

if(top==0)

else

/*輸出探路迷宮留下的蹤跡*/

#if 0

for(x=1;x<=m;x++)

#else

/*輸出整個迷宮*/

for(x=0; x <= m + 1; x++)

#endif

printf("\n");

system("pause");

}return 0;

}

四.除錯分析:測試資料和結果:有路徑的情況,

無路徑的情況,

演算法時間複雜度:

o(m²)

這個迷宮問題的演算法中,要在開始設定迷宮的大小。在探索迷宮路線的過程中,是通過不斷的嘗試來得到最終的結果,由於不能對已經設定為可走路徑進行返回,所以在這個演算法中有時候可能不能得到走出迷宮的路徑。如下:

資料結構課程設計(十) 迷宮問題

1 任務簡述 設計非遞迴演算法,根據入口和出口位置將給定迷宮中的全部可行路線輸出,並標記出其中的最短路徑 int mg 10 10 該二維陣列表示迷宮,0表示可行,1表示不可行。要求 1 提示使用者從鍵盤輸入入口位置和出口位置 2 輸出所有可行路線及其路徑長度 路徑中包含的點的個數 並標記出其中的最...

課程設計 迷宮問題

課程設計 迷宮問題 c 個人設計 2010 01 16 15 06 字型大小 大大 中中 小小 迷宮問題 1設計目的 要求 以乙個m n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。基本要求 首先實現乙個以煉表作...

資料結構課程設計

資料結構課程設計 include define n 30 include include includeusing namespace std struct node typedef node phone,mingzi node hashnumble node hashname int hash1 ...