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

2021-07-11 18:37:21 字數 1555 閱讀 4815

2023年5月12日 更新

本來一直想寫乙個遊戲,但是自己的功力又不夠,正好在《資料結構》一書中看到了棧應用之迷宮尋路演算法,所以打算寫乙個自動生成隨機迷宮並可以自動解迷宮的程式。我本來打算用c寫的,但是寫起來卻不太順手,一方面是我對c的語法不太了解,另一方面是c在好多地方反而不夠靈活。比如,當函式需要有多個返回值或者需要使用結構體指標作為函式引數的時候。所以,我先用c寫了乙個大概,後續我會用c++重寫,並完善這個程式。

演算法思路:手動生成乙個迷宮儲存在二維陣列裡面。規定,0代表牆。1-6代表通道,並分別表示通道上每個格仔的不同狀態。具體如下

0-牆 1-下一次將探尋這個格仔上面的格仔 2-下一次探尋這個格仔右邊的格仔 3-下一次探尋這個格仔下邊的格仔 4-下一次探尋這個格仔左邊的格仔 5-這個格仔所有方向都走過了 6-這個格仔之前走過且無法走通

在定義了迷宮中每個格仔的狀態後,我們就可以通過遍歷整個迷宮,一步一步找到迷宮出口。具體做法是從迷宮起點開始,根據當前格仔的狀態資訊,找到下乙個格仔的位置,然後前往下乙個格仔,並且更新當前格仔狀態資訊和把當前格仔座標壓棧,作為路徑資訊儲存起來。若下乙個格仔是牆,則從棧頂彈出乙個座標,這個座標就是來時的路徑座標。接著根據其狀態資訊,重複之前的步驟。當下乙個格仔的座標等於出口座標時,則結束。

我們還需要注意,需要記錄路徑的走向資訊,比如,我們從左向右走到底了,那麼最後乙個靠牆的格仔就不能再繼續向左走回去,這樣就會形成乙個死迴圈。遇到這種情況時,我們應該記錄來時的方向,在探尋新的方向的時候就必須避開來時的方向。當4個方向探索完畢都找不到出路了,那麼就直接從棧中彈出上乙個格仔的座標,繼續找出路。

詳細**與注釋如下:

#include #include #include #define row 10

#define col 10

int stus[row][col]= ,,,

,,,,

,,,}; //0牆壁 1 up 2 right 3 down 4 left 5 back 6回退路徑,顯示用

int comefrom[row][col];

int b_x=1,b_y=1; //起點

int e_x=9,e_y=7; //終點

int stack_x[row],stack_y[row]; //stack

int cur=-1; //top 指向棧頂元素

void push_(int x,int y)//push

int pop_()//pop

void print_(int stus[row][col]){

int x,y;

system("cls");

for(x = 0;x效果圖

迷宮#代表牆

尋路演算法執行完畢後 #代表牆 @代表走過的路徑

python迷宮尋路 迷宮尋路問題 A 演算法

迷宮尋路問題 a 演算法 迷宮尋路問題是人工智慧中的有趣問題,如何表示狀態空間和搜尋路徑是尋路問題的重點,本文的主要內容是a 搜尋演算法的理解和應用,首先對基本知識和演算法思想進行了解,再通過其對迷宮問題求解應用,編寫 python 程式進行深入學習。1.搜尋區域 我們假設某個人要從 start 點...

迷宮尋路(A星尋路演算法)

題目 假設我們有乙個7 5大小的迷宮,如下圖所示,綠色格仔表示起點,紅色的格仔表示終點,中間的3個深灰色格仔表示障礙物。請找到一條從起點到終點最短的路徑。解題思路 需要引入兩個集合和乙個公式,如下 具體步驟 把起點放入openlist 檢查openlist中是否有值,如果沒有則無法到達終點,結束尋路...

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

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