最簡單的迷宮求解

2021-07-28 17:50:59 字數 1493 閱讀 5833

在計算機中,我們可以把迷宮當做乙個二維陣列。其中0表示通路,1表示牆。

我們以下圖為例,對於只有一條通路的簡單迷宮進行求解

該迷宮儲存在「map.txt」文件中。

對於該迷宮,我們首先將入口點壓入棧中,然後通過對該點的上、右、下、左分別進行探測,找到合適的點前進,並將該點壓入棧中。為了防止將已經走過的點再走一遍,我們需要對已走過的點進行賦值,將其賦為2.當點繼續前進的時候很容易會進入到乙個死胡同當中,即從這個點到其他點沒有通路,我們需要運用到回溯法。回溯法就是將已將壓棧的點進行出棧,為了區分那些點是不是經過了出棧,我們將那些出棧的點賦為3。運用回溯法我們可以測試之前的點還有沒有其他的通路,依次查詢。最終,我們就會找到迷宮的出口。

對於該迷宮的求解**如下:

#include#include#include#pragma warning(disable:4996)

using namespace std;

const size_t n = 10;

void initmap(int maze[n], size_t n)

} }}void printmap(int maze[n], size_t n)

cout << endl;

} cout << endl;

}struct pos

;bool checkway(int maze[n], size_t n, pos& pos)

else }

bool getpath(int maze[n], size_t n, pos& entry)

//上next = cur;

--next._row;

if (checkway(maze, n, next))

//右next = cur;

++next._col;

if (checkway(maze, n, next))

//下next = cur;

++next._row;

if (checkway(maze, n, next))

//左next = cur;

--next._col;

if (checkway(maze, n, next))

//該點附近沒有通路,使用回溯法

pos prev = path.top();

maze[prev._row][prev._col] = 3; //退回的標記為3

path.pop();

} return false;

}void testmaze()

int main()

這段**的執行結果為:

我們可以很清晰的看到迷宮的解,並且我們能發現這個迷宮是如何求解的。

迷宮問題求解(1) 簡單迷宮

標頭檔案 include include include include include maze.h define max 100 typedef struct position datatype typedef struct stack stack void stackinit stack s ...

簡單迷宮問題的求解 BFS

描述 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。輸入乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。輸出左上角到右下角的最短路徑,格式如樣例所示。樣例輸入 0 1...

迷宮(最簡單的01迷宮模板) 2018 8 13

問題描述 鐵塔尼號遇險了!他發出了求救訊號。距離最近的哥倫比亞號收到了訊息,時間就是生命,必須盡快趕到那裡。通過偵測,哥倫比亞號獲取了一張海洋圖。這張圖將海洋部分分化成 n n 個比較小的單位,其中用 1 標明的是陸地,用 0 標明是海洋。船隻能從乙個格仔,移到相鄰的四個格仔。為了盡快趕到出事地點,...