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