隨機迷宮生成與尋路演算法(3)深度優先搜尋

2021-10-03 10:32:46 字數 3533 閱讀 9023

該方法很容易理解:

首先我們將迷宮的起始點入棧將棧頂元素標記為當前座標,然後按照已經定義好的方向陣列依序從上、下、左、右四個方向(方向可以是任意的,但沒必要每次都進行隨機選取)來遍歷當前座標的相鄰方塊如果這個取得的方塊是合法的(也即是說這個方塊不是邊界,不是障礙物,並且沒有標記為路線或者死胡同),則結束搜尋。如果這個取得的方塊不合法,則進行下乙個方向的搜尋當四個方向都搜尋結束以後,判斷在這個過程中是否找到了乙個可行的相鄰方塊,如果找到了則將找到的方塊入棧,然後回到步驟2

下面看**,我們給上次的迷宮類新增乙個新方法mazesolve用於迷宮求解,新增乙個新的stack>變數用於儲存求解路線:

bool maze::

solvemaze()

if(isinrange

(currentx, currenty)

and(

getdata

(currentx, currenty)

>0)

));//當前座標入棧

setdata

(currentx, currenty,-2

);break;}

currentx -

= direction[i]

.first;

currenty -

= direction[i]

.second;}if

(!flag)}}

}

除此以外,為了能夠列印正確路線,還需要調整一下之前的print方法。新的print方法接受乙個布林型別引數,如果引數為false表示列印求解前的迷宮,如果引數為真表示列印求解後的迷宮,全部**如下:

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

pair<

int,

int>

input()

;}class

maze,,

,}; stack

int,

int>> path;

public

:maze

(int x,

int y)

; ostream&

print

(bool mode =

false);

bool

createmaze()

;bool

solvemaze()

;private

:bool

setentry

(int x,

int y)

;void

setstartpoint()

;bool

dig(

int x,

int y)

;bool

isinrange

(int x,

int y)

;void

setdata

(int i,

int j,

int d)

;int

getdata

(int i,

int j);}

;bool maze::

solvemaze()

//非邊界,不是牆,沒走過,沒標記死路if(

isinrange

(currentx, currenty)

and(

getdata

(currentx, currenty)

>0)

));//-2標記為走過

setdata

(currentx, currenty,-2

);break;}

//走錯恢復

currentx -

= direction[i]

.first;

currenty -

= direction[i]

.second;}if

(!flag)}}

}bool maze::

isinrange

(int x,

int y)

if(y <=

1or y >= size.second)

return

true;}

bool maze::

dig(

int x,

int y)}}

//四個方向都沒有未標記方塊

if(x == start.first and y == start.second)

else

}maze::

maze

(int row,

int column)

:size()

);for(

int i =

0; i < row; i++);

}setentry(2

,1);

}void maze::

setstartpoint()

if(entry.first == size.first)

if(entry.second ==1)

if(entry.second == size.second)

}bool maze::

createmaze()

;setdata

(size.first-

1, size.second,1)

;return

true;}

bool maze::

setentry

(int x,

int y)

if(x ==

1or x == size.first or y ==

1or y == size.second)

; mazeptr[x -1]

[y -1]

=1;return

true;}

return

false;}

ostream& maze::

print

(bool mode)

cout << endl;}}

else

} cout << endl;}}

return cout;

}int

main

(int argc,

char

*ar**)

經測試,執行結果如下圖所示:

求解前:

求解後:

隨機迷宮生成與尋路演算法(1)深度優先搜尋

接下來一段時間,想要研究下隨機迷宮生成演算法,打算在有空可時候偶爾更新一下這方面的學習過程。隨機迷宮的生成演算法有很多種,比如遞迴回溯,遞迴分割,隨機prime等等。今天是第一次嘗試隨機迷宮生成,就先試一下用遞迴的方法通過深度優先搜尋來生成隨機迷宮。首先我們來明確一下基本觀念,迷宮可以通過乙個二維陣...

學習筆記 迷宮生成與尋路演算法

2016年5月12日 更新 本來一直想寫乙個遊戲,但是自己的功力又不夠,正好在 資料結構 一書中看到了棧應用之迷宮尋路演算法,所以打算寫乙個自動生成隨機迷宮並可以自動解迷宮的程式。我本來打算用c寫的,但是寫起來卻不太順手,一方面是我對c的語法不太了解,另一方面是c在好多地方反而不夠靈活。比如,當函式...

Python練習 3 迷宮尋路演算法

用陣列建立出乙個迷宮,0為可以通過的路徑,1為牆壁。l 0,0,1,1,1 1,0,1,1,1 0,0,1,0,0 0,1,1,0,1 0,0,0,0,1 for i in l print i 用兩個陣列記錄開始的位置和已走過的位置 stack 0,0 history 0,0 定義上 下 左 右四個...