在計算機中,我們可以把迷宮當做乙個二維陣列。其中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 標明是海洋。船隻能從乙個格仔,移到相鄰的四個格仔。為了盡快趕到出事地點,...