問題描述:給定乙個大小為n*m的迷宮。迷宮有通道和牆壁組成,每一步可以向鄰接的上下左右的通道移動。請求出從起點到終點所需要的最小步數。
例如,n為10, m為10,輸入的迷宮如下表示,其中s表示起點,g表示終點,"."表示通道,「#」表示牆壁
#s######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...g#
則輸出為22。
解法:可以將每一步看作是一次狀態轉移,要求步數最少則是發生狀態轉移的次數最少。從每一點到下乙個點最多共有4次狀態轉移,可以利用乙個寬度優先搜尋來進行實現。寬度優先搜尋中發生狀態轉移次數少的點總是會首先被訪問,當我們第一次訪問到該點時所經歷的狀態轉移次數即為起點到該點的最短距離,這樣我們可以利用乙個陣列d[n][m]來儲存已經訪問過的點,這樣就可以由近及遠的搜尋。在這裡求最短的距離,我們不妨用這個陣列將最短距離儲存起來,用乙個無窮大inf來初始化這個陣列,當該點沒用被訪問過時,相對應的d陣列中的值就應該為inf,當我們第一次訪問到這個點時對d陣列進行更新,儲存下到該點總共的狀態轉次數,即為起點到該點的最短距離。搜尋結束後我們返回終點位置所對應的d陣列中的值,如果仍為inf則表示不存在起點到終點的路徑。
在下面的程式中,我們使用乙個pair型別來表示乙個點的座標,使用兩個陣列大小dx[4],dy[4]來表示4個方向向量,這樣通過乙個迴圈就可以遍歷四個方向的移動。
#include#includeusing namespace std;
const int inf = 1000000;
typedef pairp;
char mi[10][11] = ;//迷宮陣列
int n = 10, m = 10;//迷宮大小
int sx = 0, sy = 1;
int gx = 9, gy = 8;
int dx[4] = , dy[4] = ;
int d[10][10];
int bfs()
} queueque;
//取出起點
que.push(p(sx, sy));
d[sx][sy] = 0;
//進行寬度優先搜尋
while(que.size())
for (int i = 0; i < 4; i++)
{ int nx = p.first + dx[i];
int ny = p.second + dy[i];
//d[nx][ny]==inf即表示該點未被訪問過
if (nx>=0 && nx=0 && ny
問題 A 迷宮求解問題
時間限制 10 sec 記憶體限制 2048 mb 提交 574 解決 306 提交 狀態 討論版 用乙個m n的矩陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對給定的迷宮,求出找到的第一條從入口到出口的通路,或得到沒有通路的結論。我們指定 1 迷宮的入口為矩陣的左上角 1,1 迷宮...
迷宮問題求解(1) 簡單迷宮
標頭檔案 include include include include include maze.h define max 100 typedef struct position datatype typedef struct stack stack void stackinit stack s ...
迷宮問題1
c 語言程式設計練習1 程式設計練習 編寫程式尋找迷宮路徑。入口 x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x 出口x 圖1讀取迷宮檔案 如圖1所示 不限於此迷宮 以入口為開始 出口為終點 程式設計尋找一條穿越迷宮的路...