prim生成迷宮
大致思路是:首先,生成迷宮全部都是圍牆設為1表示圍牆的值就是1。其次,把迷宮之外的輪廓設定為0表示邊框,然後設定起點和重點的值分別為2和2.
接下來就要判斷起始點下下個低方判斷是否是圍牆,因為防止打穿圍牆或者達到之前的路上在圍牆中不斷的挖路從而生成迷宮。方法主要是從起點開始每乙個上下左右,當發現有圍牆,則往圍牆移動,然後繼續判斷最終不斷遞迴。
void maze::mazeinit()//生成迷宮的主要函式
for(int i=0, j=2nn+2; i<=2nn+2; ++i)
maze[2][1] = 2; //預設迷宮座標第三行第一例為起點
maze[2nn][2nn+1] = 3; //預設2nn 行 和 2nn+1列為終點
//生成無符號隨機數
srand((unsigned)time(null));
//生成的隨機數在 [0, nn+1]之間,生成路徑
searchpath(rand()%nn+1, rand()%nn+1); //nn+1為隨機生成數的最大值,即迷宮的邊長
//將地圖整體向左上方平移乙個單位
for(int i = 0; i < n; i++)
}len_path = 0;
}int maze::searchpath(int x, int y) //隨機生成迷宮
;int zx = x2;
int zy = y2;
int next, turn, i;
maze[zx][zy] = 0;
//設定turn為[0, 4]之間的任意乙個奇數
turn = rand()%2 ? 1 : 3;
//next=rand()%4 取值範圍[0, 4),
//next=(next+turn)%4 每個迴圈在奇數和偶數之間切換,[0, 4)遍歷一遍
//在迷宮地圖裡,隨機選乙個地方,開始挖路,4次迴圈,往4個方向挖(由(next+turn)%4實現)
for(i=0, next=rand()%4; i<4; ++i, next=(next+turn)%4)
//搜尋當前位置的第二步,如果是圍牆,這將當前位置的沿著指定方向的下一步設定為路
//這樣做的原因: 防止打穿最外層的圍牆, 防止造成回環
if(maze[zx+2dir[next][0]][zy+2dir[next][1]] == 1) //具體思路:在當前位置都要探測四周是否可以挖洞
return 0;
}dfs深度優先演算法
主要思路:先設定乙個鍊錶,然後不斷拿尾部節點去探路,同樣也是上下左右判斷。然後有路則把尾部增加,然後頭部也增加,但是尾部要把自己上乙個的xy(位置)賦給頭部,當尾部遇到終點時,則停止迴圈。若沒有遇到終點並且此時沒有路了,則返回到之前沒有走全的點繼續走迷宮。到達終點後然後用getpath函式通過遞迴呼叫front顯示出路徑。
void maze::getpath(int pos)//得到相應尋路的路徑
}void maze::dfs()
front = tail = 0;
q[tail].x = sx; //鍊錶尾部x和y加入起點
q[tail].y = sy;
q[tail].pre = -1;
tail++;
int x, y, nx, ny;
bool fg = false;
while(front < tail)//front永遠比tail小,要跳出迴圈只能到達終點為止
{x = q[front].x;
y = q[front].y;
for(int i = 0; i < 4; i++)
{nx = x+dx[i];//第十行有定義
ny = y+dy[i];
if(nx>=0&&nx=0&&ny結果演示:
深度優先搜尋應用 走迷宮
走迷宮問題是深度優先搜尋的乙個典型應用,通常迷宮的形狀如下 0為可走的道路,1為牆壁。通常情況下一些變種的模型,會加入一些特殊項,有別的意思,比如數字5代表鑰匙,當然複雜模型先不討論,從最簡單的開始。include include include include using namespace st...
走迷宮(深度優先搜尋版)
includeusing namespace std int a 50 50 book 50 50 n,m,p,q 定義全域性變數,二維陣列a用來儲存n行m列的迷宮,book陣列用來標記。p,q為目的地座標,min記錄最小步數 void dfs int x,int y,int step dfs函式用...
深度優先 迷宮演算法
前一陣一直想寫這個程式,一直沒有有效的解決儲存路徑的問題。現在想到的辦法是用佇列儲存每個節點的下表來表示路徑。這個演算法解決問的問題是 建乙個迷宮 用矩陣表示m行,n列 期中矩陣的左上角 座標為 0,0的點 為入點,找尋到所有到 m 1,n 1 的所有不重複路徑,並列印出來。注釋如下 include...