上學時沒學過資料結構和演算法,於是現在有機會就自學。下面是我最近在等待進入專案組期間,花了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 ...