下面給出迷宮問題的乙個直觀感受圖,下圖中棕色代表通道阻塞,白色代表可用通道,紅色代表起始位置,綠色代表當前位置,黃色代表出口。
迷宮1:
首先將入口設為當前位置;然後從當前位置出發,按照固定順序(例如:右左上下順序)探測第乙個可用下乙個單元,然後將這下乙個單元設為當前單元,重複探測,直至遇到出口;如果探測的過程中發現,在當前節點,無論右左上下哪個位置都不能到達下乙個可用位置,則退回到當前節點的上乙個節點,將上乙個節點設為當前單元,繼續探測。依次類推。
這裡注意幾點:
1)每個走過的單元,必須標記為已經走過,後面不能再重複走。
因為走過的單元, 分為兩種,第一種可以找到出口的,那麼你再次走回來,可能陷入同一段路徑的迴圈,
比如 a->b->c->a->b->c。我們要消除這種重複路徑。
第二種,是不能找到出口的,既然第一次走過就不能找到出口,為什麼還要走第二次?
所以,走過的單元不能再重複的走。
2)每次從單元格四個方向中選個乙個可用單元,要保持對這四個方向的計數,上次嘗試過得方向,下一次就不能重複再試了,反證法可以說明。
3)程式出口問題,要麼是試驗後找到路徑,這時棧裡儲存的就是整個路徑;要麼是找不到路徑,那麼棧為空,因為你不斷回退,最後到了起點,起點還是沒有路徑,因此退棧後即為空棧。
#include#include#include#define m 8
#define n 8
using namespace std;
/*每次按照dir的方向進行深度優先搜尋,可以走則走並標記,否則,
回溯並清除標記,直到找到右下角的出口。
*/// 迷宮,maze[i][j] = 0 代表ij可以走, arr[i][j]=1表示不能走
int maze[m+2][n+2] = ,
, ,
, ,
, ,
, ,
};// 四個方向,分別代表上,下,左,右
int dir[4][2] = , , , };
// 節點資訊,x代表橫座標,y代表縱座標
struct node
};// 列印路徑,使用鍊錶,易於輸出
void print_path(listpath)
}int dfs(node cur, node end, list&path)
// 從4個方向分別探索
for(int i = 0; i < 4; ++i) }
// 如果該節點幾個方向均已遍歷,而且都不可行,該節點出棧,回溯
path.pop_back();
return 0;
}int main( )
採用深度優先遍歷時,求出路徑不應定最短;由此,提出以下演算法,主要思想是利用佇列,採用廣度優先搜尋法,當第一次出現目的點時,中斷搜尋,並輸出路徑。
#include #include #include #define m 8
#define n 8
using namespace std;
// 迷宮,maze[i][j] = 0 代表ij可以走, arr[i][j]=1表示不能走
int maze[m+2][n+2] = ,
, ,
, ,
, ,
, ,
};// 節點資訊,x代表橫座標,y代表縱座標
struct node
};// 虛擬佇列中的節點及其前驅資訊
struct queueelem
};void print_path(vector&que)
while(!s.empty())
}void maze_shortest(node start, node des)
, , , };
vectorque; // 用於記錄節點入隊順序
int head = 0; // 用於指向佇列頭部
que.push_back(queueelem(start, -1)); // 初始點入隊,其前驅為-1
while(head < que.size()) // 當虛擬佇列非空時}}
head++; // 虛擬出隊
}}int main()
經典迷宮問題
經典的迷宮問題,分別用了bfs與dfs解決。include include using namespace std 6 8 0 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 1 0 ...
經典迷宮問題BFS
給定乙個迷宮,入口為左上角,出口為右下角,問是否有路徑從入口到出口,若有則輸出一條這樣的路徑。注意移動可以從上 下 左 右 上左 上右 下左 下右八個方向進行。迷宮輸入0表示可走,輸入1表示牆。易得可以用1將迷宮圍起來避免邊界問題。本題採用bfs演算法給出解。注意,利用bfs演算法給出的路徑必然是一...
迷宮問題 (經典dfs)
題目 迷宮問題,給你乙個n m的矩陣,其中0代表通路,1代表阻塞。給你起點座標和終點座標,詢問 最小路徑從起點到達終點。題目分析 一般問你最小的基本都是dfs或者bfs,再其次,能用bfs的基本都能用dfs 個人理解 include include include include using nam...