這個題目和資料結構—圖有關
迷宮的隨機生成和路徑搜尋主要和圖的遍歷有關,一般來說圖的遍歷主要有兩種方式:1、深度優先遍歷(dfs)2、廣度優先遍歷(bfs)
兩種遍歷方式都很好理解,就說說深度優先遍歷:
可以這樣描述深度遍歷:
(1)訪問頂點v;
(2)從v的未被訪問的鄰接點中選取乙個頂點w,重複第一步,如果v沒有未訪問的鄰接點,回溯至上一頂點;
(3)重複上述兩步,直至圖中所有和v有路徑相通的頂點都被訪問到。
那麼,迷宮的生成和路徑搜尋與圖的遍歷有什麼關係呢?
假設有如下乙個圖:
試著對這個圖進行深度優先遍歷並把遍歷的軌跡記錄下來,如下圖。
遍歷順序依次為 1—>2—>6---->10---->9---->5----->13----->14----->15----->11----->12-----16---->8----->7----->3---->4,
是不是有點迷宮的樣子了呢?但是上面這個經過遍歷生成的路徑圖還不能完全算乙個迷宮,因為還缺少了「牆」,補上即可成為乙個完整的迷宮,如下圖:
上圖中藍色的節點為牆,在遍歷過程中將點之間的牆「抹掉」–即空白的格仔,這樣就可形成乙個完整的迷宮,如上圖。
怎麼樣,是不是就是乙個迷宮了,注意到遍歷一次後任意兩點之間都可以找到一條路, 所以迷宮的出口和入口只需要從外圍的點任選兩個即可(如上圖中選擇的是1旁邊的和16旁邊的點)。
經過上面的分析,我們就知道該怎麼生成乙個迷宮了。
1、首先初始化迷宮的雛形,即乙個矩形圖陣,並為圖的每個節點旁邊都新增上「牆」,如下圖:
2、然後對圖中的非「牆」節點進行遍歷(深度優先或廣度優先都行),為了能夠生成隨機的迷宮,我們可以在遍歷過程過適當的做一些隨機的操作(**中會說明),每次遍歷時即打通當前遍歷的點與上乙個點之間的「牆」
3、遍歷完所有的點即可生成乙個迷宮,然後再選擇出口與入口,乙個完整的迷宮就形成了。
至於迷宮的路徑搜尋,那就完全是圖的深度遍歷了,大概過程如下。
(1)從迷宮起點節點v開始訪問
(2)訪問這個節點v,標記為可行的路徑;
(3)從v的未被訪問的非"牆"鄰接點中選取乙個頂點w,重複第二步。如果v沒有未訪問的非"牆"鄰接點,把這個節點的可行路徑標記移除,回溯至上一節點;
(4)重複上述第(2)、(3)步,直至遍歷到迷宮的出口節點。
#include
// 迷宮座標位置型別
struct postype
;#define maxlength 25
// 設迷宮的最大行列為25
typedef
int mazetype[maxlength]
[maxlength]
;// [行][列]
// 全域性變數
struct postype end;
// 迷宮終點位置
mazetype m;
// 迷宮陣列
int n;
// 迷宮行數,列數
// 定義牆元素值為0,可通過路徑為-1,通過路徑為足跡
int min_value =
10000
;// 由當前位置cur、當前步驟curstep試探下一點
//curstep表示當前已經嘗試的步數
void
try(
struct postype cur,
int curstep)
struct postype direc[4]
=,,,
};// 移動方向,依次為東南西北
for(i=
0;i<=
3;i++
)// 依次試探下左上右四個方向}}
intmain()
}
begin.x =
1,begin.y=1;
end.x = n-
2,end.y= n-2;
m[begin.x]
[begin.y]=2
;try
(begin,0)
;// 由第一步起點試探起
if(min_value ==
10000
)printf
("no solution");
else
printf
("%d"
,min_value)
;return0;
}
隨機生成迷宮
首先初始地圖所有位置均設為障礙牆,然後任意插入乙個牆體進牆佇列 再判斷此時牆體是否可以設定為路 判斷依據 上下左右四個位置是否只有乙個位置是路 若設定為路,則將該位置四周所有的牆插入佇列 若無法設定為路,直接從牆佇列中刪去當前結點所在的節點,若牆佇列不為空,則從佇列中隨機選取一處障礙重新執行,重複以...
搜尋迷宮路徑
從入口出發,按某一方向向前探索,若能走通則到達新點,並試探下一方向 若所有方向均沒有通路,則沿原路返回前一點,換下乙個方向再繼續試探,知道所有可能的路徑都試探到,或找到出口,或者無路可走退回到入口.為了能夠保證在到達某一點後不能繼續向前走時能退回到上乙個點並繼續進行下乙個方向的探尋,則需要有乙個能滿...
演算法 隨機生成迷宮
演算法原理 從起點開始,隨機選擇乙個方向移動,一直移動到終點,則移動的路徑便是迷宮的路徑。移動過程中要保證路徑不要相交,不要超出邊界,生成效果 public partial class mainform form void btncreateclick object sender,eventargs...